Ich werde beschreiben, wie ich Dateien in SQL Server und Oracle gespeichert habe. Es hängt in erster Linie davon ab, wie Sie die Datei erhalten, wie Sie ihren Inhalt erhalten, und es hängt davon ab, welche Datenbank Sie für den Inhalt verwenden, in dem Sie sie speichern, und wie Sie sie speichern. Dies sind 2 separate Datenbankbeispiele mit 2 separaten Methoden zum Abrufen der von mir verwendeten Datei.
SQL Server
Kurze Antwort: Ich habe eine Base64-Byte-Zeichenfolge verwendet, die ich in eine konvertiert byte[]
und in einem varbinary(max)
Feld gespeichert habe .
Lange Antwort:
Angenommen, Sie laden über eine Website <input id="myFileControl" type="file" />
hoch , verwenden also ein Steuerelement oder React DropZone. Um die Datei zu erhalten, machen Sie so etwas wie var myFile = document.getElementById("myFileControl")[0];
oder myFile = this.state.files[0];
.
Von dort würde ich die base64-Zeichenfolge mit Code hier erhalten: Konvertiere input = file in byte array (benutze Funktion UploadFile2
).
Dann würde ich diesen String, den Dateinamen ( myFile.name
) und den Typ ( myFile.type
) in ein JSON-Objekt bekommen:
var myJSONObj = {
file: base64string,
name: myFile.name,
type: myFile.type,
}
und senden Sie die Datei mit XMLHttpRequest an ein MVC-Server-Backend, wobei Sie einen Inhaltstyp angeben application/json
: xhr.send(JSON.stringify(myJSONObj);
. Sie müssen ein ViewModel erstellen, um es zu binden:
public class MyModel
{
public string file { get; set; }
public string title { get; set; }
public string type { get; set; }
}
und geben Sie [FromBody]MyModel myModelObj
als übergebenen Parameter an:
[System.Web.Http.HttpPost]
public virtual ActionResult Post([FromBody]MyModel myModelObj)
Anschließend können Sie dies zu dieser Funktion hinzufügen und mit Entity Framework speichern:
MY_ATTACHMENT_TABLE_MODEL tblAtchm = new MY_ATTACHMENT_TABLE_MODEL();
tblAtchm.Name = myModelObj.name;
tblAtchm.Type = myModelObj.type;
tblAtchm.File = System.Convert.FromBase64String(myModelObj.file);
EntityFrameworkContextName ef = new EntityFrameworkContextName();
ef.MY_ATTACHMENT_TABLE_MODEL.Add(tblAtchm);
ef.SaveChanges();
tblAtchm.File = System.Convert.FromBase64String(myModelObj.file);
die operative Linie sein.
Sie benötigen ein Modell zur Darstellung der Datenbanktabelle:
public class MY_ATTACHMENT_TABLE_MODEL
{
[Key]
public byte[] File { get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
Dadurch werden die Daten in einem varbinary(max)
Feld als gespeichert byte[]
. Name
und Type
waren nvarchar(250)
und nvarchar(10)
jeweils. Sie können die Größe einschließen, indem Sie sie als int
Spalte & MY_ATTACHMENT_TABLE_MODEL
as zu Ihrer Tabelle public int Size { get; set;}
hinzufügen und in der tblAtchm.Size = System.Convert.FromBase64String(myModelObj.file).Length;
obigen Zeile hinzufügen .
Orakel
Kurze Antwort: Konvertieren Sie es in a byte[]
, weisen Sie es einem zu OracleParameter
, fügen Sie es Ihrem hinzu OracleCommand
und aktualisieren Sie das BLOB
Feld Ihrer Tabelle unter Verwendung eines Verweises auf den ParameterName
Wert des Parameters ::BlobParameter
Lange Antwort: Als ich dies für Oracle getan habe, habe ich ein verwendet OpenFileDialog
und die Bytes / Datei-Informationen auf folgende Weise abgerufen und gesendet:
byte[] array;
OracleParameter param = new OracleParameter();
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.Filter = "Image Files (*.jpg, *.jpeg, *.jpe)|*.jpg;*.jpeg;*.jpe|Document Files (*.doc, *.docx, *.pdf)|*.doc;*.docx;*.pdf"
if (dlg.ShowDialog().Value == true)
{
string fileName = dlg.FileName;
using (FileStream fs = File.OpenRead(fileName)
{
array = new byte[fs.Length];
using (BinaryReader binReader = new BinaryReader(fs))
{
array = binReader.ReadBytes((int)fs.Length);
}
param.OracleDbType = OracleDbType.Blob;
param.ParameterName = "BlobParameter";
param.Value = array;
}
fileName = fileName.Split('\\')[fileName.Split('\\').Length-1];
string fileType = fileName.Split('.')[1];
if (fileType == "doc" || fileType == "docx" || fileType == "pdf")
fileType = "application\\" + fileType;
else
fileType = "image\\" + fileType;
string sql = String.Format("INSERT INTO YOUR_TABLE (FILE_NAME, FILE_TYPE, FILE_SIZE, FILE_CONTENTS, LAST_MODIFIED) VALUES ('{0}','{1}',{2},:BlobParamerter, SYSDATE)", fileName, fileType, array.Length);
RunCommand(sql, param);
}
Und innerhalb des Oracle-Updates, das mit ADO erstellt wurde:
public void RunCommand(string sql, OracleParameter param)
{
OracleConnection oraConn = null;
OracleCommand oraCmd = null;
try
{
string connString = GetConnString();
oraConn = OracleConnection(connString);
using (oraConn)
{
if (OraConnection.State == ConnectionState.Open)
OraConnection.Close();
OraConnection.Open();
oraCmd = new OracleCommand(strSQL, oraConnection);
if (param != null)
OraCommand.Parameters.Add(param);
OraCommand.ExecuteNonQuery();
}
}
catch (OracleException err)
{
}
finally
{
OraConnction.Close();
}
}
private string GetConnString()
{
string host = System.Configuration.ConfigurationManager.AppSettings["host"].ToString();
string port = System.Configuration.ConfigurationManager.AppSettings["port"].ToString();
string serviceName = System.Configuration.ConfigurationManager.AppSettings["svcName"].ToString();
string schemaName = System.Configuration.ConfigurationManager.AppSettings["schemaName"].ToString();
string pword = System.Configuration.ConfigurationManager.AppSettings["pword"].ToString();
if (String.IsNullOrEmpty(host) || String.IsNullOrEmpty(port) || String.IsNullOrEmpty(serviceName) || String.IsNullOrEmpty(schemaName) || String.IsNullOrEmpty(pword))
{
return "Missing Param";
}
else
{
pword = decodePassword(pword);
return String.Format(
"Data Source=(DESCRIPTION =(ADDRESS = ( PROTOCOL = TCP)(HOST = {2})(PORT = {3}))(CONNECT_DATA =(SID = {4})));User Id={0};Password={1};",
user,
pword,
host,
port,
serviceName
);
}
}
Und der Datentyp für die FILE_CONTENTS
Spalte war BLOB
, FILE_SIZE
war NUMBER(10,0)
, LAST_MODIFIED
war DATE
und der Rest war NVARCHAR2(250)
.