【问题标题】:How do I setup ContentType of Azure Blob correctly?如何正确设置 Azure Blob 的 ContentType?
【发布时间】:2018-07-11 22:08:33
【问题描述】:

在我的 Web API 中,我使用以下代码来创建 blob:

        var container = Client.GetContainerReference(DefaultContainer);
        var blockBlob = container.GetBlockBlobReference(blobName);

        blockBlob.UploadFromStream(fileStream);

        blockBlob.Properties.ContentType = "video/mp4";
        blockBlob.SetProperties();

当从外部下载文件时,我需要 ContentType 标头值为video/mp4

但是,当我使用外部链接下载该文件时,Azure 不会添加相应的 ContentType。 (它实际上并没有附加任何东西)。

那么,我该如何实现呢?

【问题讨论】:

  • 我在我这边测试,在Azure blob中点击下载,在浏览器中打开了一个链接。它显示了一个 mp4 文件。然后我右键单击另存为,它会在我的本地文件夹中下载一个 mp4 文件。我设置了一个断点来查看blob的属性。它显示正确的内容类型,如下所示:image.ibb.co/kxnEuR/blobtype.png。所以我不确定你是如何操作的。
  • ContentType 是网络服务器随文件返回的标头。在您的情况下,它只是您通过 SDK 传递给 Azure 的元数据。 ibb.co/d64oM6msdn.microsoft.com/en-us/library/…
  • 所以您的问题似乎与 web api 相关,而不是 Azure。 web api 默认只支持 json 或 xml 类型。如果我们想显示'video/mp4'类型,我们需要为其添加相应的内容类型。您可以像这样添加内容类型:response.Headers.Add("ContentType", "video/mp4")。或者你可以阅读链接:stackoverflow.com/questions/16736439/…
  • 这个问题与 Web Api 完全无关。该文件的添加方式与您尝试添加它的方式相同。文件的进一步下载是通过任何其他应用程序外部的直接链接完成的。
  • 可能和缓存有关,可以使用隐身窗口再次测试。您也可以将Azure storage exploer 用于检查blob 属性。

标签: azure mime-types content-type azure-blob-storage azure-management-api


【解决方案1】:

您需要先获取属性/元数据,然后再更新它们,因此您的代码应该是:

var container = Client.GetContainerReference(DefaultContainer);
var blockBlob = container.GetBlockBlobReference(blobName);
blockBlob.UploadFromStream(fileStream);

// Set the content type
blockBlob.FetchAttributes();
blockBlob.Properties.ContentType = "text/html";
blockBlob.SetProperties();

【讨论】:

  • 感谢@thomas 的回复,但我感到非常沮丧!无论我做什么,对我来说都没有任何改变!结果还是一样。我可能会错过一些东西吗?像需要订阅级别还是其他什么?我看不到我的代码对 blob 有任何影响。您能否澄清以下内容:这一切都与存储帐户/容器/特定博客容器/容器项目有关(如果通过 Azure 门户导航)?另外,在应用SetProperties() 之后,我应该在哪里通过门户直观地看到这些更改(编辑元数据?那些只是空的)?
  • 你试过异步方法吗? FetchAttributesAsync, UploadFromStreamAsync, SetPropertiesAsync ?您是否使用 sas 令牌来更新内容类型或访问密钥?
  • Thomas,我正在使用 AccountKey(将整个 ConnectionString 存储在 web.config 中)。而且,Async 方法不喜欢改变任何东西。
  • 您能否给我一个提示,我应该在哪里看到通过 Azure 门户应用(或手动应用)的更改?
  • 这应该即时应用。顺便说一句,你有什么错误吗?你所说的异步方法不喜欢改变什么是什么意思
【解决方案2】:

如果未提供任何内容,Azure blob 将使用默认值“application/octet-stream”。为了获得正确的 mimetypes,这就是我对我的烧瓶应用程序所做的:

@app.route('/', methods=['GET', 'POST'])
def upload_file():

    if request.method == 'POST':
        f = request.files['file']
        mime_type = f.content_type
        print (mime_type)
        print (type(f))
        try:
            #blob_service.create_blob_from_path(container, f, f.filename)
            blob_service.create_blob_from_stream(container, f.filename, f,
            content_settings=ContentSettings(content_type=mime_type))

mime_type 被传递给 ContentSettings 以获取上传到 azure blob 的文件的当前 mimetypes。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2020-02-08
    • 2021-05-02
    • 2013-12-04
    • 2011-09-13
    • 2018-02-07
    相关资源
    最近更新 更多