Putobjectcommand'da üstbilgi ContentDisposition ayarlamaya çalışmak 403 yasakla sonuçlanır

0

Soru

Uygulamamla dosyaları S3'e başarıyla yüklüyorum. Sunucumun aws-sdk v3 kullanarak benim için oluşturduğu bir signedUrl kullanarak tarayıcıdan doğrudan yükleme yapıyorum.

Singed URL'yi almak için biraz şuna benziyor

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

Bu gayet iyi çalışıyor, ancak dokümantasyonun bir kısmını okuduğumda başlık içeriğini ayarlayabilmem gerektiğini gördüm. Bu belgelerde, PutObjectCommand girdisinin putobjectrequest'ten uzandığını söylüyor

İkincisi, isteğe bağlı bir parametreye sahiptir ContentDisposition bunu ek olarak ayarlamak istediğim gibi, kullanıcılarım için bir "indirme" penceresi istememe izin vermek için. Ancak, signedurl'yi yukarıdaki gibi kullandığımda ancak eklediğimde ContentDisposition:'attachment' alan Yasak bir Hata alıyorum.

Burada bir şey kaçırıp kaçırmadığımı bilen var mı? bu gerçek bir seçenek değil mi yoksa bunun için S3 izinlerimdeki bir şeyi değiştirmem gerekiyor mu?

1

En iyi cevabı

1

Belirtmek gerekiyor ContentDisposition için PutObjectCommand param ve ayrıca getSignedUrl bu şekilde işlev:

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

Diğer dillerde

Bu sayfa diğer dillerde

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