Untuk menyimpan fail ke dalam pangkalan data atau cakera, pertimbangkan kaedah yang paling cekap dan boleh dipercayai. Satu cara ialah menukar fail kepada tatasusunan bait sebelum menyimpannya. Artikel ini meneroka sama ada menukar fail kepada tatasusunan bait ialah strategi terbaik untuk menyimpan sebarang format fail.
Kesesuaian menukar fail kepada tatasusunan bait untuk storan pangkalan data bergantung pada pangkalan data khusus yang digunakan. Contohnya, dalam SQL Server, mencipta jadual menggunakan lajur VARBINARY(MAX)
membolehkan penyimpanan tatasusunan bait yang cekap.
Kod C# berikut menunjukkan cara menyimpan fail daripada pemacu ke dalam pangkalan data:
<code class="language-csharp">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(); } }</code>
Untuk mendapatkan semula fail dan menyimpannya ke pemacu anda:
<code class="language-csharp">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); } } }</code>
Kaedah ini membenarkan fail diambil semula sebagai aliran memori:
<code class="language-csharp">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); memoryStream.Write(blob, 0, blob.Length); } } return memoryStream; }</code>
Akhir sekali, masukkan aliran memori ke dalam pangkalan data:
<code class="language-csharp">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; }</code>
Menukar fail kepada tatasusunan bait boleh menjadi cara yang cekap untuk menyimpan fail dari sebarang format dalam pangkalan data atau pada cakera dengan menggunakan lajur VARBINARY(MAX)
yang sesuai dalam SQL Server. Contoh kod yang disediakan menyediakan pelaksanaan yang komprehensif untuk membaca dan menulis fail binari dalam pangkalan data, memastikan kegigihan yang boleh dipercayai dan mendapatkan semula fail.
Atas ialah kandungan terperinci Adakah Menukar Fail kepada Tatasusunan Byte Penyelesaian Optimum untuk Penyimpanan Pangkalan Data?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!