将文件从一个AWS S3 Bucket复制到另一个包含Node的存储桶

时间:2018-06-13 07:36:33

标签: node.js amazon-web-services amazon-s3

我正在尝试使用Node将文件从AWS S3存储桶复制到另一个存储桶。问题是如果文件名没有空格,例如:“abc.csv”,它工作正常。 但是,如果要复制的文件在文件名中有空格,例如:“abc xyz.csv”。它抛出了以下错误。

“指定的密钥不存在。” “NoSuchKey:指定的密钥不存在。     在Request.extractError(d:\ Projects \ Other \ testproject \ s3filetoarchieve \ node_modules \ aws -sdk \ lib \ services \ s3.js:577:35)

以下是提供的代码。

return Promise.each( files, file => {
        var params = {
            Bucket: process.env.CR_S3_BUCKET_NAME, 
            CopySource: `/${ process.env.CR_S3_BUCKET_NAME }/${ prefix }${ file.name}`, 
            Key: `${ archieveFolder }${ file.name }`
        };
        console.log(params);
        return new Promise(( resolve, reject) => {
            s3bucket.copyObject(params, function(err, data) {
                if (err){
                    console.log(err, err.stack); 
                    debugger
                } else {
                    console.log(data); 
                    debugger
                }             
            });
        });
    }).then( result => {
        debugger
    });

早期的帮助将非常值得注意。谢谢。

1 个答案:

答案 0 :(得分:1)

我认为问题正是文件名中的空格。

S3密钥必须是url编码的,因为它们需要以URL格式访问。 有一些软件包可以帮助您进行网址格式设置,例如speakingUrl 或者您可以尝试自己编写一些,如果您想保持友好,可以只使用破折号(\s)替换空格(_ or -)。

如果您不介意,可以简单地encodeURIComponent(file.name)

希望它有所帮助!