大型 pdf 文件未在具有 aws 签名 url 的浏览器中打开

Posted

技术标签:

【中文标题】大型 pdf 文件未在具有 aws 签名 url 的浏览器中打开【英文标题】:Large pdf files are not opening in browser with aws signed url 【发布时间】:2022-01-15 21:20:48 【问题描述】:

我正在使用 NodeJS 将文件上传到 s3,并在上传时为 pdf 设置正确的 contentType。它看起来像这样,

const params = 
  Bucket: "noob_bucket",
  Key: newFileName,
  Body: fs.createReadStream(path),
  ContentType: 'application/pdf',
  ACL: 'private',
;

现在的问题是,当我尝试使用签名 URL 显示 pdfon 浏览器时,只有当文件大小大约小于 25MB 时,它才会在浏览器中打开,否则它只是在下载文件。

谁能帮我解决这个问题。我也有 > 50MB 的文件。

请帮我解决这个问题。提前致谢

【问题讨论】:

【参考方案1】:

控制 PDF 文件是否作为附件显示或下载的标题是 content-disposition 标题。如果要在浏览器中显示内容,则应为inline

上传文件时可以在参数中明确设置:

const params = 
  Bucket: "noob_bucket",
  Key: newFileName,
  Body: fs.createReadStream(path),
  ContentType: 'application/pdf',
  ContentDisposition: 'inline',
  ACL: 'private',
;

此外,您可能希望在请求预签名 url 时设置它:

const command = new GetObjectCommand(
    Bucket: 'noob_bucket',
    Key: newFileName,
    ResponseContentDisposition: 'inline',
    ResponseContentType: 'application/pdf',
);
const url = await getSignedUrl(s3Client, command,  expiresIn: 3600 );

【讨论】:

不清楚为什么小 PDF(低于 25MB)打开,但大的下载。 另外,默认的内容配置是内联的。如果缺少内容处置标头是这里的原因,这进一步提出了问题。 问题是我必须为 pdf 制作 ResponseContentDisposition: 'inline', ResponseContentType: 'application/pdf'。谢谢@Ervin。 ?

以上是关于大型 pdf 文件未在具有 aws 签名 url 的浏览器中打开的主要内容,如果未能解决你的问题,请参考以下文章

使用其预签名 URL 从 AWS s3 读取文件的内容

AWS S3 生成签名 URL ''AccessDenied''

仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误

带有签名 URL 的 AWS CloudFront:403 访问被拒绝

PUT 上传文件到 AWS S3 预签名 URL Retrofit2 Android

PDF 未在 UIWebView 中正确显示