Почему я не могу загрузить BLOB-объект Azure с помощью основного приложения asp.net, опубликованного на сервере Azure - PullRequest
1 голос
/ 01 мая 2019

Я пытаюсь загрузить BLOB-объект из контейнера учетной записи хранения Azure. Когда я запускаю приложение локально, я получаю правильную папку «Cкачать» C: \ Users \ xxxx \ Downloads. Когда я публикую приложение в Azure и пытаюсь загрузить файл, я получаю сообщение об ошибке. Я пробовал разные «Известные папки», и некоторые возвращают пустые строки, другие возвращают папки на сервере 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 Ответ

3 голосов
/ 01 мая 2019

Поскольку вы говорите о публикации в Azure, код, вероятно, из веб-приложения, верно? А код для веб-приложения запускается на сервере . Это означает, что код пытается загрузить BLOB-объект на сервер, на котором запущено веб-приложение .

Чтобы предоставить пользователю ссылку для скачивания, чтобы он мог загрузить файл, используйте FileStreamResult, который

Представляет ActionResult, который при выполнении запишет файл из потока в ответ.

A (псевдокод) пример:

[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"
  };
}
...