Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js AWS Lambda getSignedUrl不为.txt文件创建可下载链接,但适用于.docx_Node.js_Amazon S3_Aws Lambda_Aws Sdk - Fatal编程技术网

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

Node.js AWS Lambda getSignedUrl不为.txt文件创建可下载链接,但适用于.docx,node.js,amazon-s3,aws-lambda,aws-sdk,Node.js,Amazon S3,Aws Lambda,Aws Sdk,我正在尝试创建一个签名URL,以允许从AWS S3存储桶下载文件。向Node.JS lambda函数传递一个文件名,它将创建一个签名url,然后在客户端触发该url以下载该文件。这适用于.docx文件,但不适用于.txt文件。相反,单击时提供的signedurl会在浏览器/控制台中打开文件。在生成用于.txt文件的签名url时,是否需要执行不同的操作 我尝试过解决这个问题,并相信这是文件类型的不同。我最初认为它可能与影响它的文件名和转义字符有关,但我重命名了.txt文件并去掉了任何特殊字符,它仍

我正在尝试创建一个签名URL,以允许从AWS S3存储桶下载文件。向Node.JS lambda函数传递一个文件名,它将创建一个签名url,然后在客户端触发该url以下载该文件。这适用于.docx文件,但不适用于.txt文件。相反,单击时提供的signedurl会在浏览器/控制台中打开文件。在生成用于.txt文件的签名url时,是否需要执行不同的操作

我尝试过解决这个问题,并相信这是文件类型的不同。我最初认为它可能与影响它的文件名和转义字符有关,但我重命名了.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
        };
//提供已签名的url,它将下载该url
功能下载(url){
$(“”,{id:'idown',src:url}).hide().appendTo('body').click();
}
我希望该文件能够将该文件下载到下载文件夹中,但事实并非如此。调试时,如果在浏览器中输入已签名的url,它只会在浏览器页面上打开文件,而不是像下载.docx文件那样下载

编辑


我相信我的问题与下面的建议不同。我想知道为什么签名url生成会像预期的那样适用于.docx文件而不是.txt文件。

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

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

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


在iframe构造中。

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

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

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

最终可能的副本,无需
内容配置
HTTP头,由浏览器决定。您的浏览器决定它不知道如何处理
.docx
文件,并要求保存它。它知道如何处理
.txt
文件并显示出来。感谢您的回复。为了使.txt文件的文件下载成为可能,我必须在content disposition头中添加什么?
var contentDisposition = 'attachment; filename=\"' + myPassedInKey + '\"';
const url = s3.getSignedUrl('getObject', {
Bucket: myBucket,
Key: myPassedInKey,
ResponseContentDisposition: contentDisposition,
Expires: signedUrlExpireSeconds
});