点击上方蓝字关注“汪宇杰博客”

我的博客使用 Azure Blob Storage 存储文章配图,结果今天玩 Azure CDN 的时候爆了,原因是图片mime type不对。我们来看看如何在 .NET Core 里批量重置 Azure Blob Storage 中文件的mime type吧。

起因

使用编程方式(Azure Storage API)上传的文件,如果不指定 ContentType ,那么 Azure 不会聪明到根据文件拓展名设置 ContentType 。这个 ContentType 最终就是输出给浏览器的HTTP Header中的content-type,即Web服务器上的mime type。对于没有设置 ContentType 的文件,直接访问 Azure Blob 的地址,会返回"application/octet-stream"。不同浏览器对此处理方式不一样,大部分浏览器会调用文件下载,而不是打开文件。于是,图片就没法显示了。

我博客中的配图,以前之所以没问题,是因为没有使用CDN让客户端直接读取图片,而是通过后台处理,会自动加上正确的mime type,因此这个问题一直没暴露。

获取文件的 ContentType

.NET Core 没有 MimeMapping.GetMimeMapping() 这个API,因此我们需要一个workaround。

感谢长沙.NET技术社区成员 @刘命汉 的发现以及 @周杰 的验证,ASP.NET Core 自带的 FileExtensionContentTypeProvider 是个可替代方案。

var pvd = new FileExtensionContentTypeProvider();

bool isKnownType = pvd.TryGetContentType("test.png", out string mimeType);

// mimeType: "image/png"

对于不认识的拓展名,TryGetContentType() 会返回 false | null

CloudBlockBlob 不设置 ContentType 的话会返回默认的 application/octet-stream,因此null不影响。

更改文件的 ContentType

对于已经上传到 Azure Blob Storage 的文件,可以通过编程方式更改 ContentType 。获取到 CloudBlockBlob 对象以后,设置 Properties.ContentType,然后调用 SetPropertiesAsync() 方法保存更改即可。

对于未上传到Azure的文件,设置完 ContentType 以后,不需要调用 SetPropertiesAsync(), 上传操作 UploadFromStreamAsync() 会带上这些属性。

参见我博客代码commit: https://github.com/EdiWang/Moonglade/commit/3508e35055ae33b2c2241d93f615283a109bad85

自制开源工具

我今天抽空写了个批量重置 Azure Blob Storage 文件Mime Type 的工具,已在 GitHub 开源:

https://github.com/EdiWang/Azure-Blob-MimeType-Reset

关键代码

获取 CloudBlobContainer

有了 CloudBlobContainer 才能遍历里面的文件

private static CloudBlobContainer GetBlobContainer()

{

CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(Options.AccountName, Options.AccountKey), true);

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

CloudBlobContainer container = blobClient.GetContainerReference(Options.ContainerName);

return container;

}

修改ContentType

此处我做了个判断,只有 ContentType 不正确的文件,才重置 ContentType

private static CloudBlockBlob TrySetContentType(CloudBlockBlob blob, string contentType)

{

if (blob.Properties.ContentType.ToLower() != contentType)

{

blob.Properties.ContentType = contentType;

return blob;

}

return null;

}

遍历文件及提交更改

var pvd = new FileExtensionContentTypeProvider();

WriteMessage($"[{DateTime.Now}] Updating Mime Type...");

int affectedFilesCount = 0;

foreach (var blob in BlobContainer.ListBlobs().OfType<CloudBlockBlob>())

{

string extension = Path.GetExtension(blob.Uri.AbsoluteUri).ToLower();

bool isKnownType = pvd.TryGetContentType(extension, out string mimeType);

if (isKnownType)

{

if (TrySetContentType(blob, mimeType) != null)

{

WriteMessage($"[{DateTime.Now}] Updating {blob.Uri.AbsoluteUri} => {mimeType}");

await blob.SetPropertiesAsync();

affectedFilesCount++;

}

}

}

参考文档:http://www.thepatrickdavis.com/blob-storage-dont-forget-the-mime/

.NET Core 批量重置 Azure Blob Storage 的 mime type相关推荐

  1. 使用Azure Blob Storage实现一个静态文件服务器

    什么是Azure Blob Storage Azure Blob Storage是微软Azure的对象存储服务.国内的云一般叫OSS,是一种用来存储非结构化数据的服务,比如音频,视频,图片,文本等等. ...

  2. Python 操作 Azure Blob Storage

    安装 Azure Storage SDK for Python 最简单的方式是在安装了 python 和 pip 的机器上直接执行下面的命令: pip install azure-storage 安装 ...

  3. Springboot进行Azure Blob Storage的开发

    java语言的开发 1.引入pom文件 <dependency><groupId>com.microsoft.azure</groupId><artifact ...

  4. Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

    Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...

  5. Azure Blob Storage 基本用法上传/下载(Java)

    文章目录 简单概念 Blob Storage Azure Blob Storage的存储结构 Azure Storage Account Container Blob 操作 Maven依赖 创建Con ...

  6. PowerShell 操作 Azure Blob Storage

    本文假设已经存在了一个 Azure Storage Account,需要进行文件的上传,下载,复制,删除等操作. 为了方便查看 PowerShell 代码执行的结果,本文使用了 MS 发布的一个 Az ...

  7. 如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  8. asp绑定gridview属性_如何在ASP.NET Core中自定义Azure Storage File Provider

    主题:如何在ASP.NET Core中自定义Azure Storage File Provider 作者: Lamond Lu 地址:  https://www.cnblogs.com/lwqlun/ ...

  9. java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...

最新文章

  1. 什么时候是创业最佳时机?7个最佳的励志创业时机GET了吗
  2. 36小时,造一个亚马逊无人商店 | 实战教程+代码
  3. [免费活动通知]RAD Studio XE8 技术研讨会(上海、成都)
  4. Spring mvc PostgreSQL 插入timestamp和int8
  5. Linux命令行模式下的复制和粘贴以及停止命令刷新
  6. BOOST_TEST_GT和BOOST_TEST_GE的用法
  7. Java 集合框架 : Collection、Map
  8. MySQL多种安装方式选择
  9. 最感叹的莫过于一见如故,最悲伤的莫过于再见陌路。最深的孤独,是你明知道自己的渴望,却得对它装聋作哑。最美的你不是生如夏花,而是在时间的长河里,波澜不惊。...
  10. cdn厂商 同兴万点_CDN进入牌照时代 工信部规范和清理CDN市场
  11. linux 邮件开源工具_使用Linux和开源工具编写剧本
  12. UnityEngine.UI.dll is in timestamps but is not known in assetdatabase
  13. CSDN - 屏蔽百度广告
  14. 【结课报告】游戏中的知识产权
  15. Inspinia Admin 2.5 All_Full_Version
  16. 特斯拉舍命狂奔:史上最强自动驾驶芯片发布背后,一场蓄意已久的进攻
  17. 我的Android读书笔记——(1)
  18. Word设置多套页码奇偶跨章节页眉【毕业论文格式记录】
  19. 阿里云磁盘异常爆满的原因及解决方法
  20. matlab 股,用Matlab来做三种股票的投资模型

热门文章

  1. 将背景色添加到Word 2007文档中
  2. 【前端基础进阶】JS-Object 功能详解
  3. 《图解 HTTP》读书笔记(未完待续)
  4. 【转】为什么自动车完全不可以犯错误
  5. 正则表达式 (grep)
  6. Facebook为Messenger应用添加群组付款功能
  7. GoLang学习笔记——data_type
  8. 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools
  9. .NET6之MiniAPI(八):日志
  10. 【分享】154页微软WPF官方手册(含.NETCore和.NET Framwork双版本)