1

我有一个亚马逊 s3 端点,我正在尝试将文件上传到客户端(有一些后端帮助)。

这是我的政策代码:

s3Policy = JSON.stringify({
  expiration: '2038-12-01T12:00:00.000Z',
  conditions: [
    ["starts-with", "$key", filename], 
    { "bucket": bucket }, 
    { "acl": "public-read" },
    ["starts-with", "$Content-Type", (fileType || 'application/octet-stream')]
  ]
})

(在此之后我将其编码为base64)

这是我的角度要求:

  var nameData = findExtension(file.name);
  $http({
    method: 'POST',
    url: '/project/' + projectId + '/files/gets3authorization',
    data: {
      fileType: file.type,
      fileExtension: nameData.extension
    }
  }).then(function(response) {
    var s3Data = response.data;
    Upload.upload({
      url: s3Data.bucketURL,
      method: 'POST',
      data: {
        key: s3Data.savedFileName,
        acl: 'public-read',
        "Content-Type": (file.type || 'application/octet-stream'),
        AWSAccessKeyId: s3Data.key,
        headers: { Authorization: undefined },
        Policy: s3Data.s3Policy,
        Signature: s3Data.s3Signature,
        filename: s3Data.savedFileName + '.' + nameData.extension,
        file: file
      }
    }).progress(function(evt) {
      var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
      $scope.log = 'progress: ' + progressPercentage + '% ' +
        evt.config.data.file.name + '\n' + $scope.log;
    }).success(function(data, status, headers, config) {
      $timeout(function() {
        $scope.log = 'file: ' + config.data.file.name + ', Response: ' + JSON.stringify(data) + '\n' + $scope.log;
      });
    }).error(function(err) {
      console.log("inner err: ", err)
    })
  }).catch(function(error) {
    console.log('outer err: ', error);
  });

这是我的政策的样子(一旦 POST 开始工作,我将加强安全性):

{
  "Version": "2012-10-17",
  "Statement": [{
    "Sid": "FileUpload",
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:PutObject",
    "Resource": "arn:aws:s3:::my_bucket/files*"
  }]
}

这是我的 CORS 配置(同样,稍后将加强安全性):

<?xml version="1.0" encoding="UTF-8" ?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
  <CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <ExposeHeader>x-amz-server-side-encryption</ExposeHeader>
    <ExposeHeader>x-amz-request-id</ExposeHeader>
    <ExposeHeader>x-amz-id-2</ExposeHeader>
    <AllowedHeader>*</AllowedHeader>
  </CORSRule>
</CORSConfiguration>

这是来自 chrome 工具的回应

Response Headers它包括POST,但Allow不包括它。

很感谢任何形式的帮助。谢谢!

4

1 回答 1

0

使用 S3 的静态网站托管功能托管网站时,可以使用POST 基于浏览器的表单上传功能;但是,网站端点不接受POST请求,并将以405 Method Not Allowed. 这不是权限或 CORS 问题。

POST请求仅被 REST 端点接受。对于非 HTTPS 请求,该模式bucket-name.s3.amazonaws.com将路由到特定存储桶的端点(但签名策略文档中的存储桶名称bucket-name仅保留,没有完整的域名)。

对于目标存储桶名称中包含一个或多个点的 https 请求,您需要为 REST 端点使用路径样式的 URL,即https://s3[-region].amazonaws.com/bucket-name/(否则主机名将与通配符 SSL 证书不匹配)。

http://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html

http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region

于 2015-11-20T22:21:09.860 回答