S3预签名URL多个内容处理标头

时间:2020-01-10 15:01:19

标签: node.js amazon-web-services amazon-s3 content-disposition pre-signed-url

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

下面是响应标题的屏幕截图,仅供参考。

Con

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:9)

我已使用适用于NodeJS的AWS开发工具包使用以下代码使用最新的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>,
    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>,
    ResponseContentDisposition: `inline; filename="${docName}"`
  });

  return url;
};

module.exports = {
  getS3SignedDocumentURL,
  getS3SignedDocumentURLPreviewable
};

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

答案 1 :(得分:0)

奇怪的是,我们经常忽略文件名之类的东西,如果 comma (,) 是用户生成的名称,那么它可能很常见。 设置 response-content-disposition 时,请确保去除特殊字符或正确转义文件名属性

请参阅https://stackoverflow.com/a/6745788/8813684了解更多详情