S3签名URL多个内容分别头部

17
我有一个S3存储桶,其中包含PDF文件作为对象,它们都是私有的。我通过编程方式创建S3预签名URL以获取该对象。它可以正常工作。现在,我希望它能够作为PDF进行预览。每个对象已经设置了Content-Type头为application/pdf。现在,如果我将response-content-disposition头设置为查询参数,则会被设置但不会覆盖已存在的Content-Disposition头,而是创建一个新的Content-Disposition头。如果我在S3对象的元数据中设置Content-Disposition头,而不是将其添加到S3预签名URL中作为查询参数,则仍然会显示2个头。这是AWS S3方面的某种错误吗?下面是参考响应头的屏幕截图。

Con

任何帮助都将不胜感激。谢谢。
2个回答

29

我已经使用AWS SDK for NodeJS中可用的最新API来解决此问题,以下是代码:

const aws = require('aws-sdk');

const AWS_SIGNATURE_VERSION = 'v4';

const s3 = new aws.S3({
  accessKeyId: <aws-access-key>,
  secretAccessKey: <aws-secret-access-key>,
  region: <aws-region>,
  signatureVersion: AWS_SIGNATURE_VERSION
});

/**
 * Return a signed document URL given a Document instance
 * @param  {object} document Document
 * @return {string}          Pre-signed URL to document in S3 bucket
 */
const getS3SignedDocumentURL = (docName) => {
  const url = s3.getSignedUrl('getObject', {
    Bucket: <aws-s3-bucket-name>,
    Key: <aws-s3-object-key>,
    Expires: <url-expiry-time-in-seconds>,
    ResponseContentDisposition: `attachment; filename="${docName}"`
  });

  return url;
};

/**
 * Return a signed document URL previewable given a Document instance
 * @param  {object} document Document
 * @return {string}          Pre-signed URL to previewable document in S3 bucket
 */
const getS3SignedDocumentURLPreviewable = (docName) => {
  const url = s3.getSignedUrl('getObject', {
    Bucket: <aws-s3-bucket-name>,
    Key: <aws-s3-object-key>,
    Expires: <url-expiry-time-in-seconds>,
    ResponseContentDisposition: `inline; filename="${docName}"`
  });

  return url;
};

module.exports = {
  getS3SignedDocumentURL,
  getS3SignedDocumentURLPreviewable
};

注意:不要忘记用实际值替换占位符(<...>),以使其正常工作。


1
感谢您提供的解决方案,我已经阅读了AWS文档(https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html#API_GetObject_RequestSyntax),其中提到响应头可以被覆盖。我尝试过了,但是没有成功。您提供的解决方案对我非常有效。 - Lolo.
@Lolo,不客气。 :) - Abdullah Khawer
有没有文档提到开发人员可以将哪些参数传递给getSignedUrl?我正在阅读SDK文档(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property),但它没有提到。 - Lolo.
1
@Lolo,你分享的文档链接中写道:“查看给定操作以获取预期的操作参数。” 如果操作是“getObject”,则可能的参数可以在此处找到:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property - Abdullah Khawer

3
很奇怪,我们经常忽略诸如文件名之类的东西,如果是用户生成的名称,则可能会出现逗号(,)。 在设置response-content-disposition时,请确保剥离特殊字符或正确转义文件名属性。
有关更多详细信息,请参见https://dev59.com/SXVD5IYBdhLWcg3wGHeu#6745788

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接