概述


在常规的HTTP应答中,Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。通俗的解释就是对于URL对应的文件(内容)是直接在浏览器中打开还是保存。


格式说明:

content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )

示例:

Content-Disposition: attachment; filename="filename.jpg"

字段说明:


  • Content-Disposition为属性名;
  • disposition-type是以什么方式下载,如attachment为以附件方式下载;
  • disposition-parm为默认保存时的文件名。

说明: 服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment。这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。

Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。

注意: 在浏览器中测试URL时一定要确保没有做过关于禁止浏览器缓存的操作。

案例测试:

使用Azure Storage Blob 结合Python Storage SDK进行测试。

前期准备
  1. azure-storage-python SDK
  2. Microsoft Azure Storage Exployer下载及使用指南

Code Sample:


# coding=utf-8 from azure.storage.blob import BlockBlobService, ContentSettings
import urllib.parse def run_sample(): block_blob_service = BlockBlobService(connection_string='<Storage Connection String>')
service = block_blob_service
container_name = 'dev'
blob_name = 'demo.txt'
service.create_blob_from_text(container_name, blob_name, 'hello world') # 设置下载方式及默认下载文件名
settings = ContentSettings(content_type='application/octet-stream', content_disposition='attachment;filename="yutest.txt"') service.set_blob_properties(container_name, blob_name, content_settings=settings)
blob = service.get_blob_properties(container_name, blob_name)
content_disposition = blob.properties.content_settings.content_disposition
print(content_disposition) # Main method.
if __name__ == '__main__':
run_sample()
上传文件使用工具查看:

获取的文件URL使用Chrome浏览器发现默认的并不是指定的filename。但是使用工具对文件生成SAS在浏览器中下载,功能正常。

原始URL测试

SAS测试

通过F12对比发现,默认的URL使用的x-ms-version:2009-09-19版本较老,使用SAS使用的x-ms-version:2017-04-17。老的api返回的结果中并不包含Content-Disposition属性,需要使用新的api。

修改存储账户默认的api版本
  • C#示例代码
var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials("<account name>", "<account key>"), "core.chinacloudapi.cn", false);

serviceProperties.DefaultServiceVersion = "2017-04-17";

cloudStorageAccount.CreateCloudBlobClient().SetServiceProperties(serviceProperties);

关于version的修改也可以参考AzureBlobUtility工具实现。

修改后URL的测试

filename中文字符支持问题

官方说明


如果任何名称/值对包含非 ASCII 字符,则会收到 400 Bad Request 。 元数据名称/值对是有效的 HTTP 标头,因此必须遵循所有控制 HTTP 标头的限制。 因此,对于包含非 ASCII 字符的名称和值,建议使用URL编码或Base64编码。


  • URL编码方案参考:

import urllib.parse
settings = ContentSettings(content_type='application/octet-stream', content_disposition='attachment;filename="{}";'.format(urllib.parse.quote('中文测试.txt')))

参考链接:

The contentDisposition does not work with the createWriteStreamToBlockBlob method option.

Content-Disposition

flask+gunicorn中文文件下载报错问题及解决

关于Azure Storage Blob Content-Disposition 使用学习的更多相关文章

  1. Azure系列2.1 —— com.microsoft.azure.storage.blob

    网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...

  2. Connect China Azure Storage Blob By Container Token In Python SDK

    简介: 基于Python SDK,使用Container Token操作container对象.关于Token的生成可以使用Storage SDK创建,也可以使用工具快速创建供测试. 示例代码: fr ...

  3. 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)

    问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...

  4. Azure Storage Blob Go SDK示例

    简介 前面一篇博客介绍了关于Azure ManagerAPI Go SDK的使用,本篇继续介绍使用Blob Go SDK 操作中国区Azure Blob. SDK下载: go get github.c ...

  5. Azure Storage Blob文件重命名

    Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...

  6. Azure Storage Blob文件名区分大小写

    最近在使用Azure Storage的时候发现Storage的命名是区分大小写的,导致我们系统在更新图片的时候有时候更新不上,最终通过判断处理文件名解决. 因此我们在使用Storage需要注意一下文件 ...

  7. 如何获取Azure Storage Blob的MD5值

    问题表述 直接使用CloudBlockBlob对象获取的Properties是空的,无法获取到对象的MD5值,后台并未进行属性值的填充 前提:blob属性本省包含md5值,某些方式上传的blob默认并 ...

  8. Azure Storage Blob 属性设置

    概述 在使用SDK做Blob对象属性的获取或设置时,如果只是直接使用get或set方法,是无法成功获取或设置blob对象的属性.主要是因为在获取对象时,对象的属性默认并未被填充到对象,这就需要执行额外 ...

  9. 【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)

    问题描述 是否可以用Java代码来管理Azure blob? 可以.在代码中加入azure-storage-blob依赖.即可使用以下类操作Azure Storage Blob. BlobServic ...

随机推荐

  1. Target runtime Apache Tomcat 7.1 is not defined 解决方法

    在工作台目录下找到 自己操作的项目的文件夹 /.settings/org.eclipse.wst.common.project.facet.core.xml 打开后,显示 <?xml versi ...

  2. UTF8、UTF16、UTF16-LE、UTF16-BE、UTF32都是些什么?

    下述内容大部分引用自CSDN: Unicode 是 unicode.org 制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持.unicode.org 官方对 Unicode 的定义是:Uni ...

  3. RxJava 2.x 理解-3

    背压:Flowable / Subscriber 在RxJava 1.x 理解 中,没有讲到背压这个概念,是因为学习太落后了,RxJava都出2了,所以直接在2上学. 背压是下游控制上游流速的一种手段 ...

  4. CentOS 6.9下的Setup工具(用于管理服务/防火墙/网络配置/验证服务)

    说明:Setup工具套件好像是CentOS下特有的用于管理服务/防火墙/网络配置等,其实就是基于命令行模式界面的GUI工具.唯一特点就是方便. 安装: #安装Setup命令工具 yum -y inst ...

  5. 正版greenvpn

    短网址 http://jsq.re(建议收藏,长期有效)长网址 https://www.greenjsq.me/网址更新页面 http://www.greenvpn.site

  6. js之对象(经典)

    一.对象的定义: 对象是JavaScript的一个基本数据类型,是一种复合值,它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值.即属性的无序集合. 二.对象的创建(多种方法) 1.对象 ...

  7. SQL Server 跨数据库事务

      模拟三个库(同一个实例中),分别是DB1.DB2.DB3 整个事务的业务如下: 1.DB1写入表数据 2.DB2写入表数据 3.DB3调用存储过程写入表数据 4.每次写入表数据间隔模拟抛异常流程, ...

  8. html里嵌入CSS的三种方式

    在HTML中定义CSS的方式有:Embedding(嵌入式).Linking(引用式).Inline(内联式),下面通过实例为大家详细介绍下它们的特点   在HTML中常用以下3种方式定义CSS:Em ...

  9. Android ProgressBar手动控制开始和停止

    这两天有个需求,点击按钮从SD卡解压压缩包,并读取压缩包内txt文档内容,然后在街面上显示出来.毕竟IO操作很耗时,如果文件较大会花费不少时间.所以,在处理数据的时候能给个进度就好了.我们通常的做法就 ...

  10. druid 配置监控界面和开启spring支持

    1.配置监控页面 <!-- JNDI方式配置数据源 --> <!-- <bean id="dataSource" class="org.sprin ...