Tentando definir o cabeçalho ContentDisposition no PutObjectCommand resulta em um 403 proibido

0

Pergunta

O upload de arquivos para o S3 com êxito com o meu aplicativo. Eu faço um upload direto do navegador usando um signedUrl que meu server gera para mim, usando o aws sdk v3.

Para obter o chamuscado URL parece um pouco como este

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

Esta é a funcionar perfeitamente bem, mas então, como eu li um pouco da documentação, vi que eu deveria ser capaz de definir o cabeçalho ContentDisposition. Na presente documentação , ele diz que a entrada de PutObjectCommand se estende desde o PutObjectRequest

O último tem um parâmetro opcional chamado ContentDisposition como eu gostaria de definir este anexo, para permitir-me para pedir um "download" janela para o meu blog. No entanto, quando eu uso o signedURL como acima, mas adicionar o ContentDisposition:'attachment' campo de eu obter uma Proibido de Erro.

Alguém sabe se estou faltando alguma coisa aqui? isto não é uma opção real ou preciso modificar alguma coisa na minha permissões de S3 para isso?

1

Melhor resposta

1

Temos que especificar o ContentDisposition para o PutObjectCommand param e também para o getSignedUrl funciona como tal:

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

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................