在IE11 / Win7下载中,从Cloudfront下载的var stars = [];
var speed = 20;
function setup() {
createCanvas(windowWidth, windowHeight);
// Create 1000 stars
for (var i = 0; i < 1000; i++) {
stars.push(new Star());
}
}
(使用已签名的网址)没有扩展名(.exe
)
我不认为它与描述here(在许多其他地方之间)的问题相同,因为文件未重命名{{1只是删除了扩展名。
该文件由来自S3的Cloudfront提供 - 并通过aws-cli上传
exe_file.exe -> exe_file
据我所知,exe_file_exe
参数不是绝对必要的,因为CF / S3 /某些东西,在某些时候,尝试做一些智能的MIME分配(加上,之前,之后)我没有那个arg上传,检查下载标题会显示正确的MIME类型。)
下载文件时收到的标题
$ aws s3 cp exe_file.exe s3://cdn/exe_file.exe --content-type "application/x-msdownload"
此仅在Windows 7的IE11中发生 - 它在IE11 / Windows 10上正常工作(我只说但我还没试过,例如,IE8 - 你无法支付我有足够的钱让自己完成这个)。其他下载也不会发生这种情况 - content-type
和HTTP/1.1 200 OK
Content-Type: application/x-msdownload
Content-Length: 69538768
Connection: keep-alive
Date: Tue, 27 Dec 2016 17:36:51 GMT
Last-Modified: Thu, 22 Dec 2016 22:31:59 GMT
ETag: "c8fc68a920e198dca95e5549f8657bfb"
Accept-Ranges: bytes
Server: AmazonS3
Age: 335
X-Cache: Hit from cloudfront
都会随扩展程序一起下载。其他浏览器也没有受到影响 - 它们都在S3中按原样下载文件。
我尝试过使用和不使用AVs - 它没有任何区别。
答案 0 :(得分:1)
您需要正确设置content-disposition
:
使用HTTP标头强制 SaveAs 为了强制浏览器在单击超链接时显示 SaveAs 对话框,您必须在要下载的文件的HTTP响应中包含以下标题:
Content-Disposition: attachment; filename="<file name.ext>"; filename*=utf-8''<file name.ext>
注意:那些不支持RFC 5987编码的用户代理在 filename 之后发生时会忽略filename*
。
您希望在SaveAs对话框中显示的文件名在哪里(例如finances.xls或mortgage.pdf) - 没有<
和>
符号。
您必须牢记以下几点:
< > \ " / : | ? *
空格。古代浏览器还需要以下内容(现在不需要,但对于一个傻瓜式解决方案可能值得这样做):
因此,您应该使用cp
选项:
--content-type (string)
为此操作指定显式内容类型。此值将覆盖任何猜测的mime类型。--content-disposition (string)
指定对象的表示信息。--metadata-directive REPLACE
指定元数据是从源对象复制还是替换为复制S3对象时提供的元数据。请注意,如果您使用以下任何参数:--content-type
,content-language
,--content-encoding
,--content-disposition
,--cache-control
或{{1}如果您希望复制的对象具有指定的元数据值,则需要为非多部分副本指定--expires
。
尝试:
--metadata-directive REPLACE
答案 1 :(得分:0)
除了接受的答案,我还向Cloudfront Signer提供了自己的response-content-disposition
参数:
from botocore.signers import CloudFrontSigner
def generate_presigned_url(filename, headers={}):
cf_signer = CloudFrontSigner(CF_KEY_ID, rsa_signer)
headers = '&'.join(["%s=%s" % (key, urllib.quote_plus(value)) for key, value in headers.iteritems()])
return cf_signer.generate_presigned_url(
'https://' + CF_DOMAIN + '/' + filename + ("" if len(headers) == 0 else "?%s" % (headers)),
# ... other params
)
使用
调用cloudfront.generate_presigned_url(file_name, {
'response-content-disposition': 'attachment; filename="exe_file.exe"; filename*=utf-8\'\'exe_file.exe'
})