从IE11(Windows 7)中的Cloudfront下载的可执行文件下载没有文件扩展名

时间:2016-12-23 18:51:53

标签: windows amazon-web-services amazon-s3 internet-explorer-11 amazon-cloudfront

在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-typeHTTP/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 - 它没有任何区别。

2 个答案:

答案 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) - 没有<>符号。

您必须牢记以下几点:

  1. 文件名应为US-ASCII字符集,不得包含特殊字符:< > \ " / : | ? *空格。
  2. 文件名不应指定任何目录路径信息。
  3. 文件名应该用双引号括起来,但大多数浏览器都支持没有双引号的文件名。
  4. 古代浏览器还需要以下内容(现在不需要,但对于一个傻瓜式解决方案可能值得这样做):

    1. Content-Type标头应在Content-Disposition之前。
    2. Content-Type标头应引用未知的MIME类型(至少在旧版浏览器消失之前)。
    3. 因此,您应该使用cp选项:

      1. --content-type (string)为此操作指定显式内容类型。此值将覆盖任何猜测的mime类型。
      2. --content-disposition (string)指定对象的表示信息。
      3. --metadata-directive REPLACE指定元数据是从源对象复制还是替换为复制S3对象时提供的元数据。
      4. 请注意,如果您使用以下任何参数:--content-typecontent-language--content-encoding--content-disposition--cache-control或{{1}如果您希望复制的对象具有指定的元数据值,则需要为非多部分副本指定--expires

        尝试:

        --metadata-directive REPLACE

答案 1 :(得分:0)

除了接受的答案,我还向Cloudfront Signer提供了自己的response-content-disposition参数:

在Python中,它看起来像

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'
})