Tôi đã phát bằng dịch vụ Lưu trữ Azure Blob để lưu/khôi phục tệp trong ngữ cảnh của một trang web được lưu trữ trong Trang Web Azure.Lưu trữ Azure Blob: Tải xuốngToByteArray VS DownloadToStream
Trong quá trình tìm hiểu, tôi đã đi kèm với hai giải pháp; đầu tiên về cơ bản sử dụng DownloadToStream
làm tương tự nhưng với FileStream
. Trong trường hợp này, tôi phải ghi tệp trong máy chủ trước khi trả lại cho người dùng.
public static Stream GetFileContent(string fileName, HttpContextBase context)
{
CloudBlobContainer container = GetBlobContainer();
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
Stream fileStream = new FileStream(
context.Server.MapPath("~/App_Data/files/" + fileName), FileMode.Create);
blockBlob.DownloadToStream(fileStream);
fileStream.Close();
return File.OpenRead(context.Server.MapPath("~/App_Data/files/" + fileName));
}
public ActionResult Download(string fileName)
{
byte[] fileContent = MyFileContext.GetFileContent(fileName);
return File(fileContent, "application/zip", fileName);
}
Mặt khác tôi đã sử dụng chức năng DownloadToByteArray
với ghi nội dung của Blob trong một mảng byte khởi tạo với kích thước của tập tin Blob.
public static byte[] GetFileContent(string fileName)
{
CloudBlobContainer container = GetBlobContainer();
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
blockBlob.FetchAttributes();
long fileByteLength = blockBlob.Properties.Length;
byte[] fileContent = new byte[fileByteLength];
for (int i = 0; i < fileByteLength; i++)
{
fileContent[i] = 0x20;
}
blockBlob.DownloadToByteArray(fileContent,0);
return fileContent;
}
public ActionResult Download(string fileName)
{
byte[] fileContent = MyFileContext.GetFileStream(fileName);
return File(fileContent, "application/zip", fileName);
}
Khi tôi xem xét cả hai tùy chọn, tôi thấy nhu cầu đầu tiên tạo tệp trong đĩa của máy chủ trong khi thứ hai lưu trữ dữ liệu từ Blob trong mảng byte tiêu thụ bộ nhớ. Trong trường hợp cụ thể của tôi, tôi sẽ xử lý kích thước tập tin của ~ 150 MB.
Với hoàn cảnh (môi trường, kích thước tệp ...) bạn nghĩ cách tiếp cận nào là tốt nhất?
Mục tiêu của bạn có luôn luôn tải xuống các tệp trên máy tính của người dùng không? Hay nói cách khác, bạn có muốn xử lý dữ liệu này trước khi truyền dữ liệu đến trình duyệt của người dùng hay không, bạn có thể trực tiếp tải xuống tệp trên máy tính của người dùng từ bộ nhớ Azure không? –
Chỉ để không mất dấu của một cái gì đó: 'DownloadToStream' đòi hỏi một' Stream' nhưng 'FileStream' không phải là loại luồng duy nhất xung quanh. – CyberDude
@GauravMantri có, ý tưởng là chỉ để donwload các tập tin mà không thực hiện bất kỳ hoạt động với nó. – Julen