给定一个https s3 url,将文件上传到s3

时间:2019-03-27 05:13:10

标签: node.js amazon-s3 aws-sdk

我试图将一个对象从s3存储桶中复制到我的s3存储桶中,但是却给了这样一个文件的http网址;

https://not-my-bucket.s3.amazonaws.com/123456738160996-2019-03-23-eo_branch_cta_view-v2-cf5e81e668466de13406877ad681895f6fdd50f38ab7fdb48193d78210098b81-acZMLZ.csv.gz?Signature=12345678Hr3ght0cOPw7bLz%2FJWM%3D&AWSAccessKeyId=123456&Expires=1554017348

如果我抛出的是浏览器,我会得到一个csv,一点也不担心(注意:我遮盖了真实网址的某些部分,因此对您不起作用)。

我在具有以下参数的节点中使用copyObject API:

var params = {         值区:“ me-buket”,         CopySource:“ https://not-my-bucket.s3.amazonaws.com/123456738160996-2019-03-23-eo_branch_cta_view-v2-cf5e81e668466de13406877ad681895f6fdd50f38ab7fdb48193d78210098b81-acZMLZ.csv.gz?Signature=12345678Hr3ght0cOPw7bLz%2FJWM%3D&AWSAccessKeyId=123456&Expires=1554017348”         ,键:“数据”     };

我不断收到错误消息: “ InvalidArgument:不支持的复制源参数。”

我在做什么错??

2 个答案:

答案 0 :(得分:1)

S3不支持将预签名URL(或任何其他URL)用作CopySource。您想要的值为/${bucket}/${key},在这种情况下为/not-my-bucket/1234567381...acZMLZ.csv.gz(前导https://替换为前导斜杠,删除了.s3.amazonaws.com,而?和删除之后的所有内容)。

但是...这仍然不太可能,除非调用copyObject()的用户有权直接读取源对象,这不太可能...否则第三方将不会给您预先签名的URL。

如上所述“修复”您的请求可能会将错误更改为AccessDenied

未经许可直接读取对象,不能使用copyObject()。您需要下载文件,然后分两步将其上传到存储桶中。

答案 1 :(得分:0)

上述错误表明您提供的CopySource参数不正确。给出CopySource参数的正确方法如下:

var params = { Bucket: "your_bucket", CopySource: "/source_bucketname_url/sourceobjectkey"};

注意:源存储桶的名称和源对象的键名称必须用斜杠(/)分隔。