Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS S3通过签名url上传_Amazon Web Services_Amazon S3 - Fatal编程技术网

Amazon web services AWS S3通过签名url上传

Amazon web services AWS S3通过签名url上传,amazon-web-services,amazon-s3,Amazon Web Services,Amazon S3,我想让用户直接上传文件到S3使用签名的url。我使用node js aws sdk创建此url: const aws = require('aws-sdk'); var config = require('../../server/config.json'); aws.config = config.aws; const s3 = new aws.S3(); const s3Params = { Bucket: config.aws.bucket, Key: instance.file

我想让用户直接上传文件到S3使用签名的url。我使用node js aws sdk创建此url:

const aws = require('aws-sdk');
var config = require('../../server/config.json');
aws.config = config.aws;

const s3 = new aws.S3();
const s3Params = {
  Bucket: config.aws.bucket,
  Key: instance.filename,
  Expires: 60,
  ACL: 'public-read'
};

s3.getSignedUrl('putObject', s3Params, (err, signedUrl) => {
  if(err){
    return next(err);
  }
  instance.uploadUrl = signedUrl;
  next();
});
所以我有签名的URL

请求URL:

我从亚马逊得到:

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIAIFVWPIVVIGIONPXA</AWSAccessKeyId><StringToSign>PUT

multipart/form-data; boundary=----WebKitFormBoundarygDui83iohothuh7E
1502381111
x-amz-acl:public-read
/f.workdoer.com/IMG_4875.PNG.png</StringToSign><SignatureProvided>Af9meXlMA7qj5HYALs7LzhWaftc=</SignatureProvided>
请求有点问题,因为当我将其与CURL放在一起时:

curl -k -X PUT -T "IMG_4875.PNG.png" "https://f.workdoer.com.s3.amazonaws.com/IMG_4875.PNG.png?AWSAccessKeyId=AKIAIFVWPIVVIGIONPXA&Expires=1502381111&Signature=Af9meXlMA7qj5HYALs7LzhWaftc%3D&x-amz-acl=public-read"
它已成功上载。我做错了什么

这是我的政策:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "Allow Public Access to All Objects",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::f.workdoer.com/*"
        }
    ]
}
和cors:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>Location</ExposeHeader>
    <AllowedHeader>Content-Type</AllowedHeader>
    <AllowedHeader>x-amz-acl</AllowedHeader>
    <AllowedHeader>origin</AllowedHeader>
    <AllowedHeader>accept</AllowedHeader>
</CORSRule>
</CORSConfiguration>

*
放
邮递
3000
位置
内容类型
x-amz-acl
起源
接受

谢谢您的帮助。

请确认:您是在同一台机器上打两个电话吗?如果不是的话,一个错误的时钟可能是问题所在。是的,在同一台机器上10秒钟的时间听起来可能和你的问题一样。谢谢!但我尝试设置内容类型。同样的结果。好像是从邮局寄来的,所以我必须用另一种方式签名。不是另一个问题的副本。这也不是CORS,也与政策无关。在这里,除其他事项外,您所犯的错误是,您正在使用
多部分/表单数据
进行
放置
。S3需要一个
PUT
的原始数据——仅仅是对象本身的八位字节,而不是它周围的表单结构。请确定:您是在同一台机器上执行两个调用吗?如果不是的话,一个错误的时钟可能是问题所在。是的,在同一台机器上10秒钟的时间听起来可能和你的问题一样。谢谢!但我尝试设置内容类型。同样的结果。好像是从邮局寄来的,所以我必须用另一种方式签名。不是另一个问题的副本。这也不是CORS,也与政策无关。在这里,除其他事项外,您所犯的错误是,您正在使用
多部分/表单数据
进行
放置
。S3希望原始数据用于
PUT
——只是对象本身的八位字节,而不是它周围的表单结构。
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>Location</ExposeHeader>
    <AllowedHeader>Content-Type</AllowedHeader>
    <AllowedHeader>x-amz-acl</AllowedHeader>
    <AllowedHeader>origin</AllowedHeader>
    <AllowedHeader>accept</AllowedHeader>
</CORSRule>
</CORSConfiguration>