如何使用Angular $ http PUT将文件上传到AWS-S3

时间:2017-01-04 13:19:10

标签: javascript angularjs amazon-web-services amazon-s3 angularjs-http

在我的Angular应用程序中,我尝试使用--> 90 AF 00 00 10 0F DC FA B6 37 5F 30 34 D7 93 2D A1 3D D6 11 10 00 <-- E9 C2 F2 69 FE 38 78 28 91 00 将文件上传到AWS-S3。

然而它无法正常工作,我得到了一个HTTP-403 Forbidden,告诉我计算的签名s3与我提供的签名不同但是如果我使用像$http.put(url, file)这样的curl发出相同的请求那么一切没问题,文件上传了。所以无论是$ http.put工作的方式是坏的(对于这个任务)还是curl有一些魔力。任何人都可以详细说明吗?

2 个答案:

答案 0 :(得分:0)

供参考:

我无法找出为什么$http无法正常工作..即使我根据这个主题发现了奇怪的事情。

所以首先我从html“抓取”了这个文件:

<input flex="40" type="file" onchange="angular.element(this).scope().$parent.selectAttachment(this)">

因为我不想为此测试目的创建指令。 selectAttachment函数只是将文件设置为我的控制器的属性。

然后看似没问题,我可以阅读this.attachment.namethis.attachment.size,但是当我写$http.put(url, this.attachment)时,我收到了签名错配错误。

然后我在本教程中尝试使用XHR:https://devcenter.heroku.com/articles/s3-upload-node

永远不幸运......

然后,作为最后的手段,我试图通过不通过角度设置来获取文件,但const file = document.getElementById('report-attachment').files[0]; 最后它对我有用。有趣的是,使用getElementById和使用$ http获取文件仍然无效,我尝试了1或2个第三方角度上传器,只有XHR o.o

对我有用的最终“解决方案”:

HTML:

<input flex="40" id="report-attachment" type="file">

JS:

            const file = document.getElementById('report-attachment').files[0];
            const url = r && r.data;
            const xhr = new XMLHttpRequest();
            xhr.open('PUT', url);
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        console.debug('success');
                    } else {
                        console.error('error');
                    }
                }
            };
            xhr.send(file);

答案 1 :(得分:0)

使用$ http服务上传文件时,设置Microsoft.VisualStudio.TestTools.UnitTesting.TestContext

非常重要
[TestClass()]
public class Init
{

    [AssemblyInitialize()]
    public static void initialize(TestContext testContext)
    {
            ContextProvider.setContext(new APITestContext());
    }
}

$ http服务的默认内容类型为Content-Type: undefined。通过设置 var config = { headers: { "Content-Type": undefined, } }; var promise = $http.put(url, file, config); ,$ http服务省略了application/json标头,XHR API将Content-Type: undefined标头设置为文件标头。