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 myModelObjals ü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[]. Nameund Typewaren nvarchar(250)und nvarchar(10)jeweils. Sie können die Größe einschließen, indem Sie sie als intSpalte & MY_ATTACHMENT_TABLE_MODELas 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 OracleCommandund aktualisieren Sie das BLOBFeld Ihrer Tabelle unter Verwendung eines Verweises auf den ParameterNameWert des Parameters ::BlobParameter
Lange Antwort: Als ich dies für Oracle getan habe, habe ich ein verwendet OpenFileDialogund 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_CONTENTSSpalte war BLOB, FILE_SIZEwar NUMBER(10,0), LAST_MODIFIEDwar DATEund der Rest war NVARCHAR2(250).