在AWS上获取现有密钥的NoSuchKey错误

时间:2019-08-07 15:37:28

标签: javascript node.js amazon-s3

我正在尝试在Node应用程序中使用s3.copyObject()来修改文件的内容处置元数据。我使用它来存储用户浏览器应命名的文件名。这给了我一个NoSuchKey错误。但是,当我查看存储分区的信息中心时,可以看到它们的键确实存在。此外,我能够使用相同的键来上传,下载和删除文件。因此,我知道密钥是正确的。我猜我丢失了一个参数,该参数导致它给我一个虚假的错误消息。

const aws = require('aws-sdk');
const config = require('../config.js');
...

static async updateFileInS3(strStoredFileName, strNewFileName){
    const updateFileS3 = async (storedFileName, newFileName) => {
        const bucketname = config.server.storageBucket;
        const spacesEndpoint = new aws.Endpoint(config.server.storageEndpoint);
        const s3 = new aws.S3({
            endpoint: spacesEndpoint
        });

        const strKey = config.server.storageFolder + "/" + storedFileName;

        const copyparams = {
            Bucket : bucketname,
            CopySource : bucketname + "/" + storedFileName, 
            Key : strKey,
            ContentDisposition : 'attachment; filename=' + newFileName,
            MetadataDirective : 'REPLACE'
        };

        await s3.copyObject(copyparams).promise();

    }

    try {
         let awsUpdateResults = await updateFileS3(strStoredFileName, strNewFileName);
    }
    catch(err) {
        console.error(`[BucketUtil]Error updating project file for ${strStoredFileName}: ${err}`);
    }

}

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果您尝试通过将s3对象复制到自身上来修改它,则需要:

 const copyparams = {
            Bucket : bucketname,
            CopySource : bucketname + "/" + strKey, // The key should be the same.
            Key : strKey,
            ContentDisposition : 'attachment; filename=' + newFileName,
            MetadataDirective : 'REPLACE'
        };

还要注意,如果通过签名的URL下载,则可以包括ResponseContentDisposition参数来动态设置ContentDisposition,而不是更新元数据。