Próba ustawić położenie zawartości nagłówka w zespole putObject prowadzi do 403 zabronione

0

Pytanie

Ja z powodzeniem pobierania plików w S3 za pomocą swojej aplikacji. Wykonuję bezpośrednie pobieranie z przeglądarki za pomocą podpisany plik, który mój serwer generuje dla mnie za pomocą aws-sdk v3.

Aby uzyskać опаленный adres URL, wygląda mniej więcej tak

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

To działa dobrze, ale potem, kiedy przeczytałem trochę dokumentacji, zobaczyłem, że powinien mieć możliwość ustawić położenie zawartości nagłówka. W tej dokumentacji jest napisane, że wprowadzanie polecenia PutObjectCommand rozpoczyna się od zapytania PutObjectRequest

Ten ostatni ma opcjonalny parametr, zwany ContentDisposition ponieważ chciałbym zamontować do tego wartość "załącznik", aby pozwól mi zażądać okno "pobieranie" dla moich użytkowników. Jednak, gdy używam signedURL, jak wyżej, ale dodaję ContentDisposition:'attachment' pole dostaję zakazanej błąd.

Wie ktoś nie opuszczę czy ja tu czegoś? to nie żart, czy muszę coś zmienić w swoich rozwiązaniach na S3 do tego?

1

Najlepsza odpowiedź

1

Musimy określić ContentDisposition dla PutObjectCommand pary, a także dla getSignedUrl funkcja jako taka:

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

W innych językach

Ta strona jest w innych językach

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