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

时间:2019-06-03 19:50:34

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

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

2 个答案:

答案 0 :(得分:0)

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

您可能必须添加“内容处置”标题和/或添加

样式:“可见性:隐藏;显示:无”

在iframe构造中。

答案 1 :(得分:0)

感谢@DevenA和@stdunbar在解决我遇到的问题方面所提供的帮助。两者都是正确的,它们需要添加“ Content Disposition”标头以强制进行下载,而不是在浏览器中将其打开。以下是我对生成签名网址的代码所做的更改。

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

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