public void SaveBase64ToFile(string base64Content, string fileName)
{
if (string.IsNullOrEmpty(base64Content)) throw new ArgumentException("內容不可為空", nameof(base64Content));
if (string.IsNullOrEmpty(fileName)) throw new ArgumentException("檔名不可為空", nameof(fileName));
byte[] data;
try
{
data = Convert.FromBase64String(base64Content);
}
catch (FormatException ex)
{
throw new ArgumentException("非有效 Base64 字串", nameof(base64Content), ex);
}
string fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
// 確保目錄存在
string dir = Path.GetDirectoryName(fullPath);
if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (var fs = new FileStream(fullPath, FileMode.Create, FileAccess.Write))
{
fs.Write(data, 0, data.Length);
fs.Flush(); // 確保寫入磁碟
}
}
public void SaveBlobFromDatabase(string connectionString, string query, string outputFileName)
{
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand(query, conn))
{
conn.Open();
// 假設查詢回傳單一資料列、單一欄位 (varbinary/varbinary(max))
object result = cmd.ExecuteScalar();
if (result == null || result == DBNull.Value)
{
Console.WriteLine("資料庫無資料");
return;
}
byte[] blob = (byte[])result;
string base64 = Convert.ToBase64String(blob); // 轉 Base64 字串
SaveBase64ToFile(base64, outputFileName);
Console.WriteLine($"已儲存至 {Path.Combine(AppDomain.CurrentDomain.BaseDirectory, outputFileName)}");
}
}
public void SaveFileToDatabase(string connectionString, string filePath)
{
byte[] data = File.ReadAllBytes(filePath);
string base64 = Convert.ToBase64String(data);
using (var conn = new SqlConnection(connectionString))
using (var cmd = new SqlCommand("INSERT INTO Files (FileName, Content) VALUES (@name, @content)", conn))
{
cmd.Parameters.AddWithValue("@name", Path.GetFileName(filePath));
// 直接存 byte[] 更有效率,這裡示範 Base64 字串欄位
cmd.Parameters.AddWithValue("@content", base64);
conn.Open();
cmd.ExecuteNonQuery();
}
}
System.IO.Compression 或第三方庫) 避免一次性配置大陣列。varbinary(max) 比存 Base64 字串節省空間且效能更好;Base64 適用於 JSON/XML 傳輸、文字型欄位。Path.Combine 與 AppDomain.CurrentDomain.BaseDirectory 確保跨平台相容。
原文連結:https://www.bianceng.cn/Programming/csharp/201410/45587.htm