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

无法使用带有预签名URL的Angularjs将文件上传到AmazonS3

齐建安
2023-03-14

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

def generateFileUploadUrl(AmazonS3Client client, String bucketName, String key, int expiryMins) {
    GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, key);
    req.setMethod(HttpMethod.POST);
    req.setExpiration(getExpiration(expiryMins)); 
    return client.generatePresignedUrl(req);
}
https://{bucketname}.amazonaws.com/{key}?AWSAccessKeyId={accesskey}&Expires={expiry}&Signature={signature}
Upload.upload({
    url: destUrl, // url shown above
    file: file
}).progress(function (evt) {
  var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
  console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
}).success(function (data, status, headers, config) {
  console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
}).error(function (data, status, headers, config) {
  console.log('error status: ' + status);
});

共有1个答案

马银龙
2023-03-14

我知道这是一个老问题,但它似乎仍然是相关的,仍然似乎相当棘手的工作。S3签名的URL上载对请求和响应中使用的字段非常讲究,并且错误消息没有太大帮助,正如您所看到的--我认为这是出于安全原因的意图,但这确实使其难以调试。

AWS签名过程也发生了变化--此时(2016年3月)的版本是AWS签名版本4(http://docs.AWS.amazon.com/general/latest/gr/signature-version-4.html)。在查看示例和Stackoverflow等信息时需要小心,因为它们与您正在使用的相同签名版本有关,因为它们不能很好地混合在一起。

我开始使用AWS SDK上传Angular/Node文件,但最终发现在服务器(node.js)端生成策略更容易,而不使用SDK。这里有一个很好的例子(虽然是节点,不是基于Grails的):https://github.com/danialfarid/ng-file-upload/wiki/direct-S3-upload-and-node-signing-example(但注意这里S3桶名的问题:AngularJs Image upload to S3)。

需要注意的一个关键事项是,您正确地将文件内容类型包含在策略生成中,并且该内容类型与您实际上载的文件的内容类型适当匹配。

这里是angular侧的代码,我使用它:

$scope.upload = function (file) {
    console.log("WebUploadCtrl upload");
    console.log("WebUploadCtrl sending S3sign request");
    var query = {
        filename: file.name,
        type: file.type
    };
    $http.post('/api/s3sign', query).success(function(response) {
        console.log("WebUploadCtrl s3sign response received");
        var s3ResponseParams = response;
        console.log("WebUploadCtrl upload  AWSAccessKeyId: " + response.AWSAccessKeyId);
        console.log("WebUploadCtrl upload  signature: " + response.Signature);
        $scope.upload = Upload.upload({
                url: s3ResponseParams.url, //s3Url
                transformRequest: function(data, headersGetter) {
                    var headers = headersGetter();
                    delete headers.Authorization;
                    return data;
                },
                fields: s3ResponseParams.fields, //credentials
                method: 'POST',
                file: file
            }).progress(function(evt) {
                $scope.progressPerCent = parseInt(100.0 * evt.loaded / evt.total);
                console.log('progress: ' + $scope.progressPerCent);
            }).success(function(data, status, headers, config) {
                // file is uploaded successfully
                console.log('file ' + config.file.name + 'is uploaded successfully. Response: ' + data);                

            }).error(function() {
                // Some error has occured
                console.log('Error uploading to S3');
          });
    });
};
 类似资料:
  • 问题内容: 我正在尝试使用预签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL,并将其作为JSON对象的一部分发送给我。我将URL作为字符串获取,如下所示: https://com-example-mysite.s3-us- east-1.amazonaws.com/userFolder/ImageName?X-Amz-Security- Token=xxfooxx%2F

  • 问题内容: 因此,我在将文件直接上传到S3时遇到了一些麻烦。目前,我的流程是向nodejs / express请求以获取签名的URL。 然后,我的角度控制器尝试使用该签名的URL($ scope.uploadDocument())直接上传到s3。 我的html表单看起来像 但是,每当我尝试上传到S3时,都会出现错误 我知道S3CORS在该存储桶的亚马逊端已正确设置,因为我已经开发了将相同存储桶用于

  • 我正在尝试使用预先签名的URL将文件上传到Amazon的S3。我从生成URL的服务器获取URL https://com-example-mysite.s3-us-east-1.amazonaws.com/userFolder/ImageName?X-Amz安全令牌=xxfoox///xxbarxx= 不幸的是,当我将其传递给Refught2时,它会修改试图将其转换为URL的字符串。我设置了,它解决

  • 我正在尝试使用邮差上传一个文件。我已经通过点击“body”(在postman中)->二进制->选择文件附加了文件。我使用S3上载预签名的URL。在url中,文件的名称与我在Postman中选择的文件的名称完全相同。运行请求时,我得到一个错误: 但是,通过导出postman请求(通过单击“Code”)来获得curl命令,我得到了: 并添加一个用于上载文件的附加选项:

  • 我正试图上传一个媒体文件(图片,任何扩展名jpg/png/jpeg或视频)到aws s3桶,从邮递员我创建了我的预签名url在我的后端如下 这成功地生成了一个url,但我似乎无法使用postman来测试它,这是我如何在postman中调整请求的截图 我所尝试的: 在上面的代码中,我尝试将签名版本v4添加到params中,但它给了我一个错误,说出了意外的关键字。我甚至尝试将其添加到aws配置和s3中