当前位置: 首页 > 知识库问答 >
问题:

无法在Amazon S3上传上发送/接收自定义元数据(使用ng文件上传)

孟修竹
2023-03-14

我正在使用ng文件上传将JPG文件上传到我的S3桶。

file.upload = Upload.upload({
    url: "https://<my-bucket-name>.s3.amazonaws.com/", 
    method: "POST",
    data: {
        key: "custom-filename.jpg", 
        AWSAccessKeyId: "<AWSAccessKeyId>",
        acl: "public-read", 
        policy: <policy>, 
        signature: <signature>, 
        "Content-Type": "image/jpeg", 
        filename: file.name, 
        file: file, 
        Metadata: {
            "x-amz-meta-hello": "Custom Metadata Value"
        }
    }
});

我还尝试了以下方法(在上面的代码中)

Metadata: {
    hello: "Custom Metadata Value"
}
"x-amz-meta-hello": "Custom Metadata Value"

我已将自定义元数据作为

["starts-with", "x-amz-meta-hello", ""]

此外,S3上Bucket权限下的CORS配置

<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>x-amz-meta-hello</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>

以上代码和设置正常工作,JPG文件已成功上载,但不知何故未设置自定义元数据值。

成功上传后,我调用Lambda函数来调整JPG的大小,并将其存储在一个单独的bucket中。即使这部分工作正常,但我无法读取Lambda函数中的自定义元数据(x-amz-meta-hello)值。我需要这个值来为上传的文件分配一个单独的文件夹。

读取Lambda函数中的自定义元数据

var s3 = new AWS.S3();
s3.headObject({
    Bucket: <BucketName>,
    Key: <S3ObjectKey>
}, function(err, data) {
    if (err) {
        console.log(err);
    }
    else
    {   
        console.log(data);
    }     
});

不确定我在这里错过了什么…请建议。

谢谢(AngularJS版本1.5.0,ng文件上传版本12.2.9,OSX 10.10.5上的Google Chrome版本53.0.2785.113)

共有1个答案

芮叶秋
2023-03-14

删除元数据:{…}构造,因为您正在构建一个HTML表单,它有一个平坦的键空间。在其他地方,您可能会看到经过特殊处理的元数据,其中类似元数据:{“hello”:“world”}的内容神奇地变成了x-amz-meta-hello:world,但这在这里不适用。相反,元数据需要从x-amz-meta开始,因为我们正在发出一个POST请求,所以它是在表单数据中提供的,而不是作为头。

因为文件数据需要是最后一个表单元素,所以将元数据键放在文件信息之上,例如:

...
"Content-Type": "image/jpeg", 
"x-amz-meta-hello": "Custom Metadata Value", 
filename: file.name, 
...

您的策略条件必须使用$$引用元数据名称才能工作([“start with”、“$x-amz-meta-hello”、”“])。请注意,需要具有策略才能接受字段,但此特定条件并不约束字段包含特定值。

还要注意<代码>

 类似资料:
  • 我使用这个网络服务上传一个文件使用泽西 //省省吧 //将上传的文件保存到新位置 当我执行我的代码我得到一个405错误!对这个问题有什么建议吗?

  • 我有一个ASP。NET文件上载控件,当您单击上载按钮选择要上载的文件时,该控件将打开一个窗口。但问题是,网络驱动程序无法识别窗口,因此无法选择要上载的文件。 我在stackoverflow中找到了许多使用sendkey输入文件路径的解决方案。我认为当你有html文件上传控制时,这是有效的。在我的情况下,我有ASP。NET文件上传控件,它没有文本框,我可以在其中使用sendkey输入文件路径。 我该

  • springboot接收前端上传到后端的文件时,在controller层内大多数使用的是MultipartFile进行接收的,当使用file进行接收时会报错 有大佬知道为啥不能用file接收文件吗?

  • 我上传一个文件到AmazonS3有问题。我开发了一个Grails RESTful服务,它使用AWS Java SDK生成预签名URL。当客户端上传一个文件时,它首先检索一个预签名的URL,然后使用这个将文件直接上传到我的S3 bucket。所以我有一个Grails服务,它创建了一个预签名的URL,如下所示...

  • 我尝试将meta_query作为数组的数组传递,每个数组包含3个键-值对,用于key、value和compare,就像在wp_query中一样。我还尝试将meta添加为,这是实际字段的名称,只有没有'meta'前缀的名称本身,以及其他一些变体。但是这些方法都不起作用。有人能告诉我这个‘自定义参数支持’是不是只指元字段以外的自定义参数,还是我做错了什么?