Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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
Angularjs S3 putObject使用aws sdk失败_Angularjs_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Angularjs S3 putObject使用aws sdk失败

Angularjs S3 putObject使用aws sdk失败,angularjs,amazon-web-services,amazon-s3,aws-sdk,Angularjs,Amazon Web Services,Amazon S3,Aws Sdk,这让我发疯了,任何帮助都将不胜感激 为了在S3中设置我的桶,我跟随 关于这篇文章,我做了以下“改进”,用通配符扩展了策略,并赋予了更多的权限 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:DeleteObjectVersion", "s3

这让我发疯了,任何帮助都将不胜感激

为了在S3中设置我的桶,我跟随

关于这篇文章,我做了以下“改进”,用通配符扩展了策略,并赋予了更多的权限

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "s3:DeleteObject",
            "s3:DeleteObjectVersion",
            "s3:GetObject",
            "s3:GetObjectAcl",
            "s3:GetObjectTorrent",
            "s3:GetObjectVersion",
            "s3:GetObjectVersionAcl",
            "s3:GetObjectVersionTorrent",
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:PutObjectVersionAcl"
        ],
        "Resource": [
            "arn:aws:s3:::photos-eu/*"
        ]
    }
]
}
并将ETag添加到存储桶的Cors设置中

然后我使用aws sdk的angular服务看起来像

/// <reference path="../../../typings/tsd.d.ts" />

module Services {

  export interface IS3UploadService {
    upload(imgName:string, imgData:string):ng.IPromise<{}>;
  }

  export class S3UploadService implements IS3UploadService {

static $inject = ['$q'];

private bucket:AWS.S3;

constructor(private $q:ng.IQService) {
  var credentials = new AWS.Credentials("myAccessKeyId", "mySecretAccessKey");
  AWS.config.update(credentials);
  AWS.config.region = "eu-west-1";

  this.bucket = new AWS.S3({params: {Bucket: 'peterparker-photos-eu', maxRetries: 10, region: "eu-west-1"}});

}

upload(imgName:string, imgData:string):ng.IPromise<{}> {
  var deferred = this.$q.defer();

  var params:AWS.s3.PutObjectRequest = {
    Bucket: "peterparker-photos-eu",
    Key: imgName,
    Body: imgData,
    ContentType: "image/jpeg",
    ContentEncoding: "Base64"
  };

  this.bucket.putObject(params, (err:any, data:any) => {
    if (err) {
      console.error("->" + JSON.stringify(err));
      deferred.reject(err);
    } else {
      console.info(data);
      deferred.resolve(data);
    }
  });

  return deferred.promise;
}

  }
}

angular.module('App')
  .service('S3UploadService', Services.S3UploadService);
更新

即使尝试上载非Base64内容,也会出现相同的错误

var paramsHtml:AWS.s3.PutObjectRequest = {
    Bucket: "peterparker-photos-eu",
    Key: "HelloWorld.html",
    Body: "The Body",
    ContentType: "text/html"
  };
更新#2

我移动到一个由我的节点js服务器生成的签名URL的解决方案,如下面的解决方案所述,仍然得到了与结果相同的错误…但我至少尝试了;)


怪胎,我终于找到了解决办法,或者至少找到了一个解决办法

在将基于客户端aws sdk的解决方案迁移到服务器生成signedUrl的解决方案之后,我仍然面临相同的错误。简而言之,它通过在两侧设置标题的内容类型修复了这个问题

如果有人有一天遇到同样的问题,我的代码是:

Server Node.js

var AWS = require('aws-sdk');

AWS.config.update({accessKeyId: "myKey", secretAccessKey: "mySecret"});
AWS.config.region = 'eu-west-1';

app.post('/api/images', securityPolicy.authorise, function (req, res) {

var s3 = new AWS.S3();

var imgName = req.body.imgName;
var contentType = req.body.contentType;

// Expires in seconds
var params = {Bucket: 'photos-eu', Key: imgName, Expires: 600, ContentType: contentType};
s3.getSignedUrl('putObject', params, function (err, url) {
    if (err) {
        res.status(500).json({
            error: "Presigned S3 url for putObject can't be created. " + JSON.stringify(err)
        });
    } else {
        res.json({url: url});
    }
});
});
客户角度:

  • 首先,或者当然,有一部分需要调用节点服务器,显然是发布到我的服务器
然后第二部分处理signedURL

private uploadToS3(preSignedUrl:string, imgData:string):ng.IPromise<{}> {
  var deferred = this.$q.defer();

  // Post image to S3
  this.$http({
    method: 'PUT',
    url: preSignedUrl,
    headers: {'Content-Type': 'image/jpeg'},
    data: imgData
  })
    .then((response:any) => {
      console.log("Image uploaded to S3" + JSON.stringify(response));

      deferred.resolve();

    }, (response:any) => {
      console.log("Error Presigned URL" + JSON.stringify(response));
      deferred.reject(response);
    });

  return deferred.promise;
}
private uploadToS3(预签名rl:string,imgData:string):ng.IPromise{
var deferred=这个$q.deferred();
//将图像发布到S3
这是$http({
方法:'放',
url:preSignedUrl,
标题:{'Content-Type':'image/jpeg'},
资料来源:imgData
})
。然后((响应:任意)=>{
log(“上传到S3的图像”+JSON.stringify(响应));
延迟。解决();
},(答复:任何)=>{
log(“错误预签名URL”+JSON.stringify(响应));
拒绝(回应);
});
回报。承诺;
}

你能为你的测试图像粘贴完整的imgData吗?当然,给你:该链接对meStrange不起作用,它对我有效,即使我的浏览器是匿名的,但没有登录Dropbox。无论如何,这里有一个文本文件副本:要捕获任何“明显的”,我们需要查看您生成的实际
PUT
请求中的所有标题。。。
private uploadToS3(preSignedUrl:string, imgData:string):ng.IPromise<{}> {
  var deferred = this.$q.defer();

  // Post image to S3
  this.$http({
    method: 'PUT',
    url: preSignedUrl,
    headers: {'Content-Type': 'image/jpeg'},
    data: imgData
  })
    .then((response:any) => {
      console.log("Image uploaded to S3" + JSON.stringify(response));

      deferred.resolve();

    }, (response:any) => {
      console.log("Error Presigned URL" + JSON.stringify(response));
      deferred.reject(response);
    });

  return deferred.promise;
}