Предопределенный URL-адрес S3 Несколько заголовков размещения содержимого - PullRequest
1 голос
/ 10 января 2020

У меня есть корзина S3 с файлами PDF в качестве объектов, и все они являются частными. Я создаю предварительно назначенный URL-адрес S3, чтобы получить объект. Работает нормально. Теперь я хочу, чтобы его можно было просматривать в формате PDF. Каждый объект уже имеет заголовок Content-Type, установленный на application/pdf. Теперь, если я задаю заголовок response-content-disposition в качестве параметра запроса, он устанавливается, но не переопределяет уже существующий заголовок Content-disposition, вместо этого он создает новый. Если я задаю заголовок Content-Disposition в метаданных объекта S3 вместо добавления его в предварительно назначенный URL-адрес S3 в качестве параметра запроса, он все равно отображает 2 заголовка. Это какая-то ошибка на стороне AWS S3?

Ниже приведен скриншот заголовка ответа для справки.

Con

Любая помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 29 января 2020

Я решил эту проблему, используя последний API, доступный для этой вещи, из AWS SDK для NodeJS, используя следующий код:

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
};

Примечание. Не забудьте заменить заполнители (<...>) с фактическими значениями, чтобы заставить его работать.

...