En essayant de définir l'en-tête ContentDisposition sur PutObjectCommand résultats dans un 403 forbidden

0

La question

- Je télécharger des fichiers à S3 avec succès à ma demande. Je fais un téléchargement direct à partir du navigateur à l'aide d'un signedUrl que mon serveur génère pour moi à l'aide de l'aws sdk v3.

Pour obtenir le roussi URL il ressemble un peu à ça

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

Cela fonctionne parfaitement bien, mais ensuite, comme je l'ai lu un peu de la documentation, j'ai vu que je devrais être capable de définir l'en-tête ContentDisposition. Dans cette documentation, il est dit que l'entrée de PutObjectCommand s'étend de la PutObjectRequest

Ce dernier est un paramètre facultatif appelé ContentDisposition comme je tiens à mettre de pièce jointe, pour me permettre de susciter une "fenêtre de téléchargement pour mes utilisateurs. Cependant, lorsque j'utilise le signedURL comme ci-dessus mais d'ajouter la ContentDisposition:'attachment' terrain j'obtiens une Erreur Forbidden.

Quelqu'un sait-il si je manque quelque chose ici? ce n'est pas une option réelle ou dois-je modifier quelque chose dans ma autorisations de S3 pour cela?

1

La meilleure réponse

1

Nous devons préciser le ContentDisposition pour l' PutObjectCommand param et aussi pour la getSignedUrl fonction en tant que telle:

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

Dans d'autres langues

Cette page est dans d'autres langues

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