【问题标题】:Web Application download from Azure Storage Blobs to ComputerWeb 应用程序从 Azure 存储 Blob 下载到计算机
【发布时间】:2019-04-22 21:36:28
【问题描述】:

我正在尝试通过网络应用程序将文件从 azure 下载到计算机。当我在本地运行项目时它可以工作,但是当我上传到 ftp 服务器时它不会下载。

我已经尝试过 Environment.SpecialFolder.Peronal、Desktop 等。

public async Task<bool> DownloadBlobAsync(string file, string fileExtension, string directory)
    {

        string downlaodPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        _container = _client.GetContainerReference(containerName);
        _directoy = _container.GetDirectoryReference(directory);

        CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file + "." + fileExtension);

        using (var fileStream = File.OpenWrite(downlaodPath +  "/"+ file + "." + fileExtension))
        {
            await blockBlob.DownloadToStreamAsync(fileStream);

            return true;
        }
    }

预期的输出应该在文档或桌面上。

【问题讨论】:

  • 如果您在 Web 服务器上托管 Web 应用程序,那么您很可能无权访问 Desktop 或 Personal 文件夹。这是因为 Web 应用程序在一个特殊的用户帐户下运行,该帐户对本地计算机可以访问的内容有限制。我希望将 blob 下载到临时文件夹(有 API 可以帮助您生成位于 Web 应用程序可以访问的位置的临时文件名)。值得更新您的问题,详细说明下载文件后您想要对文件执行的操作。
  • 就是下载自己选择的文件。例如,有一个名为 myimage.png 的文件。他们可以点击并下载。
  • 我遇到的问题是试图保存到 C: 而不是 Documents 文件夹。当我在浏览器中看到错误时,这是​​试图做的,而不是文档或下载文件夹的路径

标签: c# azure model-view-controller download


【解决方案1】:

您看到的问题是由于您的代码是在网络服务器上而不是在客户端(用户)机器上执行的。

换句话说,当您尝试保存到Environment.SpecialFolder.Personal 时,您是在尝试将其保存到网络服务器上的该文件夹,而不是用户的桌面计算机。

您需要做的是在请求中返回 blob 的内容,并让浏览器保存文件 - 可能会提示用户(取决于他们的浏览器设置)将其保存在何处。你不应该指定这个。

这是一个如何做到这一点的示例:

public async Task<HttpResponseMessage> DownloadBlobAsync(string file, string fileExtension, string directory)
{
    _container = _client.GetContainerReference(containerName);
    _directoy = _container.GetDirectoryReference(directory);

    CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file + "." + fileExtension);

    using (var ms = new MemoryStream())
    {
        await blockBlob.DownloadToStreamAsync(ms);

        var result = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ByteArrayContent(ms.ToArray())
        };

        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = "somefilename.ext"
        };
        result.Content.Headers.ContentType = new MediaTypeHeaderValue(blockBlob.Properties.ContentType);

        return result;
    }
}

注意这是低效的,因为它会先将 blob 下载到网络服务器,然后将其返回给客户端。应该足够开始了。

当浏览器点击此端点时,将提示用户将文件保存在其 PC 上的某个位置。

【讨论】:

  • 所以我可以使用 jquery 来检索文件并允许用户保存它。问题:result.Content.Headers.ContentType = new MediaTypeHeaderValue(res.ContentType);最后的res是什么?我没有看到它被声明或传递给它的变量
  • result.Content.Headers.ContentType = new MediaTypeHeaderValue(blockBlob.Properties.ContentType);我认为这就是那条线上正在发生的事情
  • 是的 - 我已经更新了代码(我基于我在内部使用的其他一些东西)。你如何达到这个端点实际上取决于你如何构建你的前端。
  • 我所做的只是将 azure 公开,因此我可以直接下载链接。它变得更容易了,而且由于所有这些文件无论如何都可以下载,所以没有理由将 blob 设为私有。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 2019-12-19
  • 2019-09-05
  • 2018-05-27
  • 2012-12-26
  • 2012-12-08
  • 2020-10-05
  • 2013-01-21
相关资源
最近更新 更多