在我的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有一些魔力。任何人都可以详细说明吗?
答案 0 :(得分:0)
供参考:
我无法找出为什么$http
无法正常工作..即使我根据这个主题发现了奇怪的事情。
所以首先我从html“抓取”了这个文件:
<input flex="40" type="file" onchange="angular.element(this).scope().$parent.selectAttachment(this)">
因为我不想为此测试目的创建指令。 selectAttachment
函数只是将文件设置为我的控制器的属性。
然后看似没问题,我可以阅读this.attachment.name
或this.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
标头设置为文件标头。