AWS Lambda getSignedUrl 不会为 .txt 文件创建可下载的 link 但适用于 .docx

AWS Lambda getSignedUrl does not create downloadable link for .txt files but works for .docx

我正在尝试创建签名 URL 以允许从 AWS S3 存储桶下载文件。对于我的 Node.JS lambda 函数,我将一个文件名传递给它,它将创建一个签名的 url,然后我在客户端触发它以下载该文件。这适用于 .docx 文件,但不适用于 .txt。相反,单击时提供的签名 url 打开 browser/console 中的文件。在生成签名的 url 以使用 .txt 文件时,是否需要做一些不同的事情?

我已尝试解决问题,相信是文件类型的差异。我最初认为这可能与影响它的文件名和转义字符有关,但我重命名了 .txt 文件并删除了所有特殊字符,但它仍然失败。该问题也不是由不同的文件大小引起的,因为我创建了两个相同的文件(一个 .docx 和另一个 .txt)并且按预期下载了 .docx 文件。 .txt 文件不会。

这是我用来从 S3 存储桶下载文件的代码

//creates signed url that is returned to client side
const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myPassedInKey,
        Expires: signedUrlExpireSeconds
        });

        responseBody = {
            success: true,
            url: url
        };
//give the signed url and it will download it
function download(url) {
    $('<iframe>', { id: 'idown', src: url }).hide().appendTo('body').click();
}

我希望文件将文件下载到下载文件夹中,但它并没有。调试时,如果您在浏览器中输入已签名的 url,它只会在浏览器页面上打开文件,而不是像下载 .docx 文件那样下载文件

编辑

我相信我的问题与下面的建议不同。我想知道为什么签名的 url 生成对 .docx 文件而不是 .txt 文件按预期工作。

我猜问题是大多数浏览器会尝试在浏览器本身中呈现 txt,而它们往往没有 docx 的处理程序,因此它们会自动默认提示用户下载文件.

您可能需要添加 "content disposition" header and/or 添加

风格:"visibility:hidden;display:none"

在 iframe 构造中。

感谢@DevenA 和@stdunbar 帮助解决了我遇到的问题。他们都正确地需要添加 'Content Disposition' header 以强制下载而不是在浏览器中打开它。下面是我对生成签名 url.

的代码所做的更改
var contentDisposition = 'attachment; filename=\"' + myPassedInKey + '\"';
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myPassedInKey,
ResponseContentDisposition: contentDisposition,
Expires: signedUrlExpireSeconds
});

上面的代码现在根据需要下载 .txt