Tratando de establecer el encabezado ContentDisposition en PutObjectCommand resultados en un 403 forbidden

0

Pregunta

Puedo subir archivos a S3 con éxito con mi aplicación. Tengo que hacer una carga directa desde el navegador utilizando un signedUrl que mi servidor genera para mí con el aws sdk v3.

Para obtener el chamuscado URL se parece un poco a esto

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

Esto está funcionando perfectamente bien, pero luego, cuando leí un poco de la documentación vio que yo debería ser capaz de establecer el encabezado ContentDisposition. En esta documentación se dice que la entrada de PutObjectCommand se extiende desde el PutObjectRequest

El último tiene un parámetro opcional llamado ContentDisposition como me gustaría configurar este apego, que me permita símbolo de una "descarga" de la ventana para mis usuarios. Sin embargo, cuando uso el signedURL como el anterior pero agrega la ContentDisposition:'attachment' campo puedo obtener una Prohibido Error.

¿Alguien sabe si estoy perdiendo de nada aquí? no es esto una opción real o tengo que modificar algo en mi permisos de S3 para esto?

1

Mejor respuesta

1

Tenemos que especificar el ContentDisposition para el PutObjectCommand param y también para la getSignedUrl funcionan como tales:

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

En otros idiomas

Esta página está en otros idiomas

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