將文件轉換爲字節數組是將任何文件格式保存到磁盤或數據庫var二進制列的最佳方式?將任何文件保存到數據庫中,只需將其轉換爲字節數組?
因此,如果有人想要保存一個.gif或.doc/.docx或.pdf文件,我可以將它轉換爲bytearray UFT8並將其保存到數據庫中作爲字節流?
將文件轉換爲字節數組是將任何文件格式保存到磁盤或數據庫var二進制列的最佳方式?將任何文件保存到數據庫中,只需將其轉換爲字節數組?
因此,如果有人想要保存一個.gif或.doc/.docx或.pdf文件,我可以將它轉換爲bytearray UFT8並將其保存到數據庫中作爲字節流?
由於沒有提到你是什麼數據庫,我假設SQL Server。以下解決方案適用於2005年和2008年
你必須創建表VARBINARY(MAX)
爲一列。在我的示例中,我創建了表Raporty
,列RaportPlik
爲VARBINARY(MAX)
列。
方法把file
到數據庫中drive
:
public static void databaseFilePut(string varFilePath) {
byte[] file;
using (var stream = new FileStream(varFilePath, FileMode.Open, FileAccess.Read)) {
using (var reader = new BinaryReader(stream)) {
file = reader.ReadBytes((int) stream.Length);
}
}
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlWrite = new SqlCommand("INSERT INTO Raporty (RaportPlik) Values(@File)", varConnection)) {
sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
sqlWrite.ExecuteNonQuery();
}
}
此法是從數據庫中獲取file
,並將其保存在drive
:
public static void databaseFileRead(string varID, string varPathToNewLocation) {
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
sqlQuery.Parameters.AddWithValue("@varID", varID);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
sqlQueryResult.Read();
var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
using (var fs = new FileStream(varPathToNewLocation, FileMode.Create, FileAccess.Write))
fs.Write(blob, 0, blob.Length);
}
}
}
這種方法是從數據庫中獲得file
並將其作爲MemoryStream
:
public static MemoryStream databaseFileRead(string varID) {
MemoryStream memoryStream = new MemoryStream();
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlQuery = new SqlCommand(@"SELECT [RaportPlik] FROM [dbo].[Raporty] WHERE [RaportID] = @varID", varConnection)) {
sqlQuery.Parameters.AddWithValue("@varID", varID);
using (var sqlQueryResult = sqlQuery.ExecuteReader())
if (sqlQueryResult != null) {
sqlQueryResult.Read();
var blob = new Byte[(sqlQueryResult.GetBytes(0, 0, null, 0, int.MaxValue))];
sqlQueryResult.GetBytes(0, 0, blob, 0, blob.Length);
//using (var fs = new MemoryStream(memoryStream, FileMode.Create, FileAccess.Write)) {
memoryStream.Write(blob, 0, blob.Length);
//}
}
}
return memoryStream;
}
這種方法是把MemoryStream
到數據庫:
public static int databaseFilePut(MemoryStream fileToPut) {
int varID = 0;
byte[] file = fileToPut.ToArray();
const string preparedCommand = @"
INSERT INTO [dbo].[Raporty]
([RaportPlik])
VALUES
(@File)
SELECT [RaportID] FROM [dbo].[Raporty]
WHERE [RaportID] = SCOPE_IDENTITY()
";
using (var varConnection = Locale.sqlConnectOneTime(Locale.sqlDataConnectionDetails))
using (var sqlWrite = new SqlCommand(preparedCommand, varConnection)) {
sqlWrite.Parameters.Add("@File", SqlDbType.VarBinary, file.Length).Value = file;
using (var sqlWriteQuery = sqlWrite.ExecuteReader())
while (sqlWriteQuery != null && sqlWriteQuery.Read()) {
varID = sqlWriteQuery["RaportID"] is int ? (int) sqlWriteQuery["RaportID"] : 0;
}
}
return varID;
}
快樂編碼:-)
您使用的數據庫是?通常你不將文件保存到數據庫中,但我認爲SQL 2008有支持它...
文件是二進制數據,因此UTF-8不要緊,這裏..
UTF當您嘗試8個事宜將字符串轉換爲字節數組......不是將文件轉換爲字節數組。
是,通常存儲在數據庫中的文件的最好方法是將字節數組保存在BLOB列。您可能需要多列來額外存儲文件的元數據,例如名稱,擴展名等。
它並不總是將文件存儲在數據庫中的一個好主意 - 例如,如果你在其中存儲文件的數據庫規模將快速增長。但這一切都取決於您的使用場景。
它確實取決於數據庫服務器。
例如,SQL Server 2008的支持FILESTREAM
數據類型正是這種情況。
除此之外,如果你使用一個MemoryStream
,它有一個ToArray()
方法,將轉換爲byte[]
- 這可以用於填充一個varbinary
場..
雖然可以以這種方式存儲文件,它有顯著權衡:
這些只是我能從頭頂上想出的一些缺點。對於小型項目,可能值得以這種方式存儲文件,但如果您正在設計企業級軟件,我強烈建議不要這樣做。
確認我能夠用張貼MadBoy和編輯答案由Otiel在MS SQL Server 2012和2014以及之前列出的使用varbinary(MAX)列的版本之外。
如果您想知道爲什麼您不能在SQL Server表設計器中將「Filestream」(在單獨的答案中註明)作爲數據類型,或者您爲什麼不能使用T-SQL將列的數據類型設置爲「Filestream」,那是因爲FILESTREAM是varbinary(MAX)數據類型的存儲屬性。它本身不是數據類型。
查看的數據庫上設置和啓用FILESTREAM這些文章: https://msdn.microsoft.com/en-us/library/cc645923(v=sql.120).aspx
http://www.kodyaz.com/t-sql/default-filestream-filegroup-is-not-available-in-database.aspx
配置完成後,一個FILESTREAM使VARBINARY(max)列可以被添加像這樣:
ALTER表表名
ADD ColumnName varbinary(max)FILESTREAM NULL
GO