【问题标题】:Azure Blob Storage to host images / media - fetching with blob URL (without intermediary controller)托管图像/媒体的 Azure Blob 存储 - 使用 blob URL 获取(无中间控制器)
【发布时间】:2017-06-28 05:14:32
【问题描述】:

this 文章中,作者提供了一种通过WebAPI 控制器上传的方法。这对我来说很有意义。

然后他建议使用 API 控制器和专用服务方法来交付 blob:

 public async Task<HttpResponseMessage> GetBlobDownload(int blobId)
 {
    // IMPORTANT: This must return HttpResponseMessage instead of IHttpActionResult

    try
    {
        var result = await _service.DownloadBlob(blobId);
        if (result == null)
        {
            return new HttpResponseMessage(HttpStatusCode.NotFound);
        }

        // Reset the stream position; otherwise, download will not work
        result.BlobStream.Position = 0;

        // Create response message with blob stream as its content
        var message = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(result.BlobStream)
        };

        // Set content headers
        message.Content.Headers.ContentLength = result.BlobLength;
        message.Content.Headers.ContentType = new MediaTypeHeaderValue(result.BlobContentType);
        message.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = HttpUtility.UrlDecode(result.BlobFileName),
            Size = result.BlobLength
        };

        return message;
    }
    catch (Exception ex)
    {
        return new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.InternalServerError,
            Content = new StringContent(ex.Message)
        };
    }
 }

我的问题是 - 为什么我们不能在将 blob URL 存储到数据库后直接引用它(而不是通过 Blob ID 获取)?

通过这样的控制器获取有什么好处?

【问题讨论】:

    标签: azure asp.net-web-api azure-storage azure-blob-storage


    【解决方案1】:

    您当然可以直接交付 blob,从而避免使用应用层的资源(虚拟机、应用服务等)。请注意,如果 blob 是私有的,您必须向客户端应用程序提供一个特殊的签名 URI(例如,添加共享访问签名),以允许该 URI 被公开使用(暂时)。您将在应用层中生成 SAS。

    您仍然可以在控制器中拥有所有访问控制逻辑,以决定谁拥有对象的权限、使用多长时间等。但您不再需要通过您的应用流式传输内容(消耗CPU、内存和网络资源)。而且您仍然可以使用 https 直接访问存储。

    【讨论】:

    • 这听起来像是一个更好的选择。我需要隐私,但我也需要成本效益。生成 SAS 似乎比通过我的应用服务流式传输更合理。通过我的应用进行流式传输还有其他好处,还是您认为那篇文章的作者不了解 SAS 方法?
    【解决方案2】:

    很简单,您可以在使用控制器时集中实施访问控制。您可以更好地控制访问文件的人员/内容/原因。你也可以很容易地记录请求。

    从长远来看,您可能希望更改文件的位置、添加分区策略以实现可扩展性,或者在您的应用中执行其他需要更改但您现在看不到的操作。当您使用控制器时,您可以将客户端代码与所有这些不可避免的更改隔离开来。

    【讨论】:

    • 这种方法可以使用 CDN 吗?
    • CDN 用于静态内容,您必须为存储中的每个文件加载一个 CDN 条目才能使其正常工作。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 2015-08-13
    • 1970-01-01
    • 2019-12-31
    • 2015-09-04
    相关资源
    最近更新 更多