node.js - AWS Lambda getSignedUrl 不会为 .txt 文件创建可下载链接,但适用于 .docx

标签 node.js amazon-s3 aws-lambda aws-sdk

我正在尝试创建一个签名 URL 以允许从 AWS S3 存储桶下载文件。对于我的 Node.JS lambda 函数,我向它传递一个文件名,它将创建一个签名 URL,然后我在客户端触发该 URL 以下载该文件。这适用于 .docx 文件,但不适用于 .txt。相反,单击时提供的签名 URL 将在浏览器/控制台中打开文件。生成签名 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();
}

我希望该文件将文件下载到下载文件夹中,但事实并非如此。调试时,如果您在浏览器中输入签名的网址,它只会在浏览器页面上打开文件,而不是像处理 .docx 文件那样下载

编辑

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

最佳答案

感谢@DevenA 和@stdunbar 帮助解决我遇到的问题。他们都正确地需要添加“内容处置” header 以强制下载而不是在浏览器中打开它。下面是我对生成签名 URL 的代码所做的更改。

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

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

关于node.js - AWS Lambda getSignedUrl 不会为 .txt 文件创建可下载链接,但适用于 .docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433705/

相关文章:

amazon-web-services - 仅适用于移动应用程序访问的 Amazon Bucket Policy

aws-lambda - AWS 无服务器 Java Lambda 调试

python - 打包需要C编译器的Python程序

amazon-web-services - AWS Lambda - 支持多个文件

node.js - Mac OSX 上 Node 版本的矛盾

javascript - 如何使用 Node 从 WebStorm 中的 JavaScript 堆栈跟踪导航到原始 TypeScript 文件?

amazon-web-services - 无法下载共享帐户 s3 存储桶上传的文件

javascript - 无法在 npm Ubuntu 中安装 jasmine-core

javascript - 来自 node js 的 HTML 代码未被浏览器解释为这样

java - 无法通过 Tomcat 服务器连接到 Amazon S3