我正在尝试在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}`);
}
}
预先感谢您的帮助。
答案 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,而不是更新元数据。