标签:-- key type get 网页 azure ext cloud 学习
在常规的HTTP应答中,Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地。通俗的解释就是对于URL对应的文件(内容)是直接在浏览器中打开还是保存。
content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )
Content-Disposition: attachment; filename="filename.jpg"
说明: 服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示,如果需要提示用户保存,就要利用Content-Disposition进行一下处理,关键在于一定要加上attachment。这样浏览器会提示保存还是打开,即使选择打开,也会使用相关联的程序比如记事本打开,而不是IE直接打开了。
Content-Disposition就是当用户想把请求所得的内容存为一个文件的时候提供一个默认的文件名。
注意: 在浏览器中测试URL时一定要确保没有做过关于禁止浏览器缓存的操作。
使用Azure Storage Blob 结合Python Storage SDK进行测试。
# 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_language=‘fr‘, content_disposition=‘attachment;filename="{}";‘.format(urllib.parse.quote(‘中文测试.txt‘)))
# 设置下载方式及默认下载文件名
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在浏览器中下载,功能正常。
通过F12对比发现,默认的URL使用的x-ms-version:2009-09-19版本较老,使用SAS使用的x-ms-version:2017-04-17。老的api返回的结果中并不包含Content-Disposition属性,需要使用新的api。
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工具实现。
官方说明:
如果任何名称/值对包含非 ASCII 字符,则会收到 400 Bad Request 。 元数据名称/值对是有效的 HTTP 标头,因此必须遵循所有控制 HTTP 标头的限制。 因此,对于包含非 ASCII 字符的名称和值,建议使用URL编码或Base64编码。
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 使用学习
标签:-- key type get 网页 azure ext cloud 学习
原文地址:https://www.cnblogs.com/taro/p/9329149.html