为什么我无法使用发布到Azure服务器的asp.net核心应用程序下载Azure Blob,

时间:2019-05-01 18:50:04

标签: asp.net azure azure-storage azure-storage-blobs core

我正在尝试从Azure存储帐户容器下载Blob。在本地运行该应用程序时,我得到正确的“下载”文件夹C:\ Users \ xxxx \ Downloads。当我将应用程序发布到Azure并尝试下载文件时,出现错误。我尝试了各种“ Knownfolders”,有些返回空字符串,另一些返回Azure服务器上的文件夹。我可以很好地上传文件,可以在容器中列出文件,但是在下载文件时很费劲。

string conn = 
configuration.GetValue<string>"AppSettings:AzureContainerConn");
CloudStorageAccount storageAcct = CloudStorageAccount.Parse(conn);
CloudBlobClient blobClient = storageAcct.CreateCloudBlobClient();
CloudBlobContainer container = 
blobClient.GetContainerReference(containerName);

 Uri uriObj = new Uri(uri);

string filename = Path.GetFileName(uriObj.LocalPath);

// get block blob reference  
CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);

Stream blobStream = await blockBlob.OpenReadAsync();

string _filepath = _knownfolder.Path + "\\projectfiles\\";
Directory.CreateDirectory(_filepath);

_filepath = _filepath + filename;
Stream _file = new MemoryStream();
try
{
 _file = File.Open(_filepath, FileMode.Create, FileAccess.Write);

 await blobStream.CopyToAsync(_file);
 }
finally
{
  _file.Dispose();
}

预期的最终结果是文件最终位于用户“下载”文件夹中的文件夹中。

1 个答案:

答案 0 :(得分:3)

由于您正在谈论发布到Azure,因此代码可能来自Web应用程序,对吗? Web应用程序的代码在服务器上运行。这意味着代码正在尝试将blob 下载到运行Web应用程序的服务器

要向用户提供下载链接以使他们能够下载文件,请使用FileStreamResult

  

表示一个ActionResult,当执行该结果时,会将文件从流写入响应。

一个(伪代码)示例:

[HttpGet]
public FileStreamResult GetFile()
{
  var stream = new MemoryStream();
  CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);
  blockBlob.DownloadToStream(stream);
  blockBlob.Seek(0, SeekOrigin.Begin);
  return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain"))
  {
    FileDownloadName = "someFile.txt"
  };
}