小编Chr*_*Tan的帖子

如何将客户端上传可查看文件到Amazon S3?

首先我要说的是,我通常非常不愿意发布这些问题,因为我总觉得有一个答案可以解决互联网上的所有问题.在花了无数个小时寻找这个问题的答案之后,我终于放弃了这个陈述.

假设

这有效:

s3.getSignedUrl('putObject', params);
Run Code Online (Sandbox Code Playgroud)

我想做什么?

  1. 使用getSignedUrl方法通过PUT(从客户端)将文件上载到Amazon S3
  2. 允许任何人查看上传到S3的文件

注意:如果有一种更简单的方法允许客户端(iPhone)使用预先签名的URL上传到Amazon S3(并且没有公开客户端的凭据),我会全神贯注.

主要问题*

  1. 查看AWS管理控制台时,上载的文件设置了空白权限和元数据.
  2. 查看上载的文件时(即双击AWS管理控制台中的文件),我收到AccessDenied错误消息.

我试过了什么?

尝试#1:我的原始代码

在NodeJS中,我生成一个预先签名的URL,如下所示:

var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600};
s3.getSignedUrl('putObject', params, function (err, url){
  console.log(url); // this is the pre-signed URL
});
Run Code Online (Sandbox Code Playgroud)

预签名的URL看起来像这样:

https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
Run Code Online (Sandbox Code Playgroud)

现在我通过PUT上传文件

curl -v -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Expires=1391069292&Signature=u%2BrqUtt3t6BfKHAlbXcZcTJIOWQ%3D
Run Code Online (Sandbox Code Playgroud)

问题
我得到上面列出的*主要问题

尝试#2:在PUT上添加内容类型和ACL

我也尝试在代码中添加Content-Type和x-amz-acl,方法是替换params,如下所示:

var params = {Bucket: mybucket, Key: "test.jpg", Expires: 600, ACL: "public-read-write", ContentType: "image/jpeg"};
Run Code Online (Sandbox Code Playgroud)

然后我尝试了一个很好的'PUT:

curl -v -H "image/jpeg" -T myimage.jpg https://mybucket.s3.amazonaws.com/test.jpg?AWSAccessKeyId=AABFBIAWAEAUKAYGAFAA&Content-Type=image%2Fjpeg&Expires=1391068501&Signature=0yF%2BmzDhyU3g2hr%2BfIcVSnE22rY%3D&x-amz-acl=public-read-write
Run Code Online (Sandbox Code Playgroud)

问题
我的终端输出一些错误:

-bash: Content-Type=image%2Fjpeg: …
Run Code Online (Sandbox Code Playgroud)

amazon-s3 amazon-web-services node.js

15
推荐指数
2
解决办法
1万
查看次数

标签 统计

amazon-s3 ×1

amazon-web-services ×1

node.js ×1