如何將用戶上傳的文件存儲到數據庫中?我想將文件存儲在數據庫中,我們如何做到這一點?在後端我使用c#.net應用程序的SQL。如何將文件存儲在數據庫中?
回答
該解決方案適用於SQL SERVER 2005/2008。
您必須創建VARBINARY(MAX)
作爲其中一列。在我的情況下,我創建了表Raporty
,列RaportPlik
爲VARBINARY(MAX)
列。
下面有幾個支持功能,你可以按需要修改:
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();
}
}
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);
}
}
}
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;
}
第一種方法是將文件放入從驅動數據庫,第二種方法是獲取文件並將其保存在驅動器,和第3方法是從數據庫中獲取文件並將其作爲MemoryStream
,這樣您就可以使用其他一些東西,然後將其寫入驅動器。
這4方法是將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;
}
保持數據庫大小不變的一個解決方案是將文件的位置存儲在服務器上。 IE一個文件路徑。
但是,如果您想要移動文件,則必須創建管理員。
您可以使用blob字段類型。當您從StreamReader中讀取文件時,將其轉換爲字節數組,然後將其插入blob字段。
當你想讀取它時,需要將blob作爲字節數組讀取到流讀取器並將其寫入響應緩衝區。
假設SQL 2005或更高版本,我會使用VarBinary(MAX)字段。將上傳的文件作爲byte []傳遞給insert語句。據微軟稱,自SQL 2005以來,在數據庫中存儲大量數據(文件和圖像)不再在很大程度上降低性能。
如:
public void SaveFileToDB(string description, byte[] file)
{
using (SqlConnection con = new SqlConnection(conStr)
{
con.Open();
using (SqlCommand cmd = con.CreateCommand())
{
cmd.Parameters.Add("@Description", SqlDbType.VarChar, description);
cmd.Parameters.Add("@File", SqlDbType.VarBinary, file);
cmd.CommandText = "UploadedFileUpdate";
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
}
}
}
如果你有SQL 2008,見羅恩·克萊因的建議。
我仍然不會推薦它,除非1)您的文件數量很少,文件很小或者2)您擁有支持解決方案擴展的基礎結構。我曾在兩家商店工作,我的第一份工作是弄清楚他們如何移動**數據庫,這些數據庫由於在數據庫中存儲文件的做法而變得失控,特別是當那些文件高度冗餘(如由MD5校驗和確定) – GrayWizardx 2010-03-15 06:01:29
@GrayWizardx同意了,但我認爲Harikrishna已經決定存儲在數據庫中。有些情況下(如共享主機)無法寫入文件系統。 – 2010-03-15 06:07:25
@羅伯特瓦格納,好點。我似乎總是忘記託管的東西。我的一個壞習慣,很好的提醒。謝謝。 – GrayWizardx 2010-03-15 06:29:11
MS SQL Server 2008(及以上,我猜)提供FileStream data type。只需Google(或Bing它,無論:-)),我想你會找到你需要的。
- 1. 如何將Html文件目錄存儲在SQL數據庫中?
- 2. 如何將MP3文件存儲在數據庫中?
- 3. 如何將'wav'音頻文件存儲在mysql數據庫中?
- 4. 如何使用Node.JS將文件存儲在Couchbase數據庫中?
- 5. 如何使用hibernate將文件存儲在postgres數據庫中?
- 6. 如何在數據庫中將數據存儲到數據庫
- 7. 如何將xls文件數據存儲到sqlite數據庫
- 8. 將用戶數據存儲在csv文件vs數據庫中
- 9. 在數據庫中存儲XML文件
- 10. 在數據庫中存儲autocad文件
- 11. 如何將文件的列表存儲在MYSQL數據庫
- 12. 將數據存儲在數據庫中
- 13. 如何將存儲在sqlite數據庫中的文件轉儲爲blob?
- 14. 如何在HTML5中將數據存儲到數據庫中
- 15. 將文本/圖像文件存儲在mysql數據庫中
- 16. 將數據存儲在文件中(C++)
- 17. 將數據存儲在HTML文件中
- 18. 如何將格式化文本存儲在數據庫中
- 19. 如何將HTML文檔存儲在數據庫中?
- 20. C#文件路徑未存儲在數據庫中。它存儲「System.Web.UI.WebControls.FileUpload」數據庫
- 21. 如何在expressjs中將會話數據存儲在文件中?
- 22. 使用python將數據庫數據存儲到json文件中
- 23. 如何將文本和二進制文件存儲在hsqldb數據庫中?
- 24. 如何使用asp.net將數據存儲在sql數據庫中#
- 25. 如何將表數據存儲在SQL Server數據庫中?
- 26. 如何將用戶數據存儲在外部數據庫中
- 27. 如何將XML數據存儲在iPhone上的數據庫中?
- 28. 如何將數據存儲在SQL數據庫中的PHP
- 29. 如何將html數據存儲在mysql數據庫中?
- 30. 如何將數據包存儲在數據庫blob中?
SQL作爲SQL服務器? SQL只是查詢語言....不是產品/數據庫系統,真的...... – 2010-03-15 06:32:12
我們的任何解決方案是否對您有所幫助,或者您仍然需要更多幫助? – MadBoy 2010-03-17 10:31:40