关于Azure Storage Blob Content-Disposition 使用学习
概述
在常规的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进行测试。
前期准备
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.
关于Azure Storage Blob Content-Disposition 使用学习的更多相关文章
- Azure系列2.1 —— com.microsoft.azure.storage.blob
网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习心得做下笔记,文中不正确地方请大家指正. Azure Blob ...
- Connect China Azure Storage Blob By Container Token In Python SDK
简介: 基于Python SDK,使用Container Token操作container对象.关于Token的生成可以使用Storage SDK创建,也可以使用工具快速创建供测试. 示例代码: fr ...
- 【Azure 存储服务】代码版 Azure Storage Blob 生成 SAS (Shared Access Signature: 共享访问签名)
问题描述 在使用Azure存储服务,为了有效的保护Storage的Access Keys.可以使用另一种授权方式访问资源(Shared Access Signature: 共享访问签名), 它的好处可 ...
- Azure Storage Blob Go SDK示例
简介 前面一篇博客介绍了关于Azure ManagerAPI Go SDK的使用,本篇继续介绍使用Blob Go SDK 操作中国区Azure Blob. SDK下载: go get github.c ...
- Azure Storage Blob文件重命名
Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...
- Azure Storage Blob文件名区分大小写
最近在使用Azure Storage的时候发现Storage的命名是区分大小写的,导致我们系统在更新图片的时候有时候更新不上,最终通过判断处理文件名解决. 因此我们在使用Storage需要注意一下文件 ...
- 如何获取Azure Storage Blob的MD5值
问题表述 直接使用CloudBlockBlob对象获取的Properties是空的,无法获取到对象的MD5值,后台并未进行属性值的填充 前提:blob属性本省包含md5值,某些方式上传的blob默认并 ...
- Azure Storage Blob 属性设置
概述 在使用SDK做Blob对象属性的获取或设置时,如果只是直接使用get或set方法,是无法成功获取或设置blob对象的属性.主要是因为在获取对象时,对象的属性默认并未被填充到对象,这就需要执行额外 ...
- 【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
问题描述 是否可以用Java代码来管理Azure blob? 可以.在代码中加入azure-storage-blob依赖.即可使用以下类操作Azure Storage Blob. BlobServic ...
随机推荐
- Aras增加新用户
Aras中新增用户,这里特别提醒,用户密码下面的可以登陆必须勾选,如不勾选刚出现不能登陆的情况. 增加用户后,将用户加入至与原同事一样的Identities(例如Sales/All Employees ...
- java 访问 kerberos 认证的 kafka
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Codeforces #442 Div2 F
#442 Div2 F 题意 给出一些包含两种类型(a, b)问题的问题册,每本问题册有一些题目,每次查询某一区间,问有多少子区间中 a 问题的数量等于 b 问题的数量加 \(k\) . 分析 令包含 ...
- sqlldr Field in data file exceeds maximum length "
使用sqlldr导数时出现如下错误: " Record 1: Rejected - Error on table PC_PLANNAME, column PLANNAME.Field in ...
- BZOJ 1878 [SDOI2009]HH的项链(扫描线+树状数组)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1878 [题目大意] 给出一个数列,给出m个查询,每次查询一个区间中不相同的数字个数 [ ...
- [BZOJ3684]大朋友和多叉树
设答案为$f_s$,它的生成函数为$\begin{align*}F(x)=\sum\limits_{i=0}^\infty f_ix^i\end{align*}$,则我们有$\begin{align* ...
- 【后缀数组】poj2406 Power Strings
连续重复子串(pku2406)给定一个字符串 L,已知这个字符串是由某个字符串 S 重复 R 次而得到的,求 R 的最大值.算法分析:做法比较简单,穷举字符串 S 的长度 k,然后判断是否满足.判断的 ...
- 【二分答案】【字符串哈希】bzoj2084 [Poi2010]Antisymmetry
显然只有偶数长度的串符合题意,并且如果一个串符合题意,那么从其首尾各截掉一个字符也符合题意. 于是枚举中心,二分可以向左右扩展的最远距离,累计答案. #include<cstdio> #i ...
- 1.1(java学习笔记) 面向过程与面向对象
面向过程思考时,我们会先思考具体的步骤,第一步走什么,第二步做什么. 比如电脑新建文件夹,第一步:打开电脑 第二步:按下鼠标右键. 第三步:找到新建选项 第四步:点击新建选项下的文件夹 c语言是典型的 ...
- 浙南联合训练赛 B-Laptops
One day Dima and Alex had an argument about the price and quality of laptops. Dima thinks that the m ...