Попытка установить расположение содержимого заголовка в команде putObject приводит к 403 запрещенным

0

Вопрос

Я успешно загружаю файлы в S3 с помощью своего приложения. Я выполняю прямую загрузку из браузера, используя подписанный файл, который мой сервер генерирует для меня с помощью aws-sdk v3.

Чтобы получить опаленный URL-адрес, он выглядит примерно так

const s3Params = {
        Bucket : bucketName,
        Key : fileName,
        ContentType:fileType,
        // Metadata:{'Content-Disposition':'attachment'}
        // ContentDisposition:'attachment'
    };


    try {
        const command = new PutObjectCommand(s3Params);

        const url = await getSignedUrl(s3v3,command,{expiresIn:60});
        return url;
    } catch (e) {
        console.log('************** there was an error signing th url');
        console.log(e);
        throw e;
    }
};

Это работает отлично, но затем, когда я прочитал немного документации, я увидел, что должен иметь возможность установить расположение содержимого заголовка. В этой документации говорится, что ввод команды PutObjectCommand начинается с запроса PutObjectRequest

Последний имеет необязательный параметр, называемый ContentDisposition поскольку я хотел бы установить для этого значение "вложение", чтобы разрешить мне запрашивать окно "загрузка" для моих пользователей. Однако, когда я использую signedURL, как указано выше, но добавляю ContentDisposition:'attachment' поле я получаю запрещенную ошибку.

Кто - нибудь знает, не пропущу ли я здесь чего-нибудь? это не реальный вариант или мне нужно что-то изменить в своих разрешениях на S3 для этого?

1

Лучший ответ

1

Мы должны указать ContentDisposition для PutObjectCommand парам, а также для getSignedUrl функция как таковая:

async function main(fileName, bucketName, fileType) {
    const s3Params = {
        Bucket: bucketName,
        Key: fileName,
        ContentType: fileType,
        ContentDisposition: 'attachment'
    };

    const client = new S3Client({region: 'us-east-1'});
    const command = new PutObjectCommand(s3Params);

    const url = await getSignedUrl(client, command, {expiresIn: 60, ContentDisposition: 'attachment'});

    const file = await fs.readFile(fileName);

    const result = await axios({
        method: 'put',
        url,
        data: file,
        headers: {
            'Content-Type': fileType,
            'Content-Disposition': 'attachment'
        }
    });

    return result;
}
2021-10-30 20:29:21

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................