Încearcă să setați antetul ContentDisposition pe PutObjectCommand rezultatele într-un 403 forbidden

0

Problema

Am încărca fișiere la S3 cu succes cu cererea mea. Eu nu o incarca direct din browser folosind un signedUrl meu server generează pentru mine folosind aws sdk-v3.

Pentru a obține ars URL-ul arată cam aș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;
    }
};

Acest lucru este perfect în regulă, dar atunci când am citit un pic de documentare am văzut că ar trebui să fie în măsură să setați antetul ContentDisposition. În acest document se spune că de intrare de PutObjectCommand se extinde de la PutObjectRequest

Acesta din urmă are un parametru opțional numit ContentDisposition cât mi-aș dori să setați aceasta la atașament, pentru a-mi permite să solicite o "descărcare" fereastra pentru utilizatorii mei. Cu toate acestea, atunci când folosesc signedURL ca mai sus, dar se adauga ContentDisposition:'attachment' domeniul primesc un Interzis de Eroare.

Stie cineva daca im-i lipsește nimic aici? nu este aceasta o optiune sau nu am nevoie de a modifica ceva în permisiunile de S3 pentru asta?

1

Cel mai bun răspuns

1

Trebuie să specificați ContentDisposition pentru PutObjectCommand param și, de asemenea, pentru getSignedUrl funcția ca atare:

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

În alte limbi

Această pagină este în alte limbi

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