I have been playing with the Azure Blob Storage service to save/recover files in a context of a web page to be hosted in Azure Web Pages.
During the learning process I have come with two solutions; the first basically uses DownloadToStream
which does the same but with a FileStream
. In this case I have to write the file in the server prior to return it to the user.
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);
}
On the other hand I used the DownloadToByteArray
function with writes the content of the Blob in an array of bytes initialized with the size of the Blob file.
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);
}
When I look at both options I see the first needs to create a file in the server's disk whereas the second stores the data from the Blob in a byte array consuming memory. In my particular case I am going to handle file sizes of ~150 MB.
Given the circumstances (environment, file sizes...) which approach do you think is best?
DownloadToStream
requires aStream
butFileStream
is not the only stream type around. – CyberDude