AngularJS如何发送multipart / mixed

时间:2015-01-25 04:38:43

标签: javascript angularjs angular-file-upload

我正在开发一个项目,我必须在AngularJS中使用文件上传一小部分JSON。

我使用Danial Farid的角度文件上传编写代码,它正在工作,除了它总是发送“multipart / form-data,boundary =< whatever>”

但是,必须使用multipart / mixed。

这是我的电话:

$scope.upload = $upload.upload({
  url: <my url>,
  method: 'POST',
  data: $scope.data,
        file: file,
}).progress(function(evt) {
  console.log('percent: ' + parseInt(100.0 * evt.loaded / evt.total));
}).success(function(data, status, headers, config) {
  // file is uploaded successfully
  console.log(data);
});

有没有办法在发送之前修改标题?

如果没有使用他的角度文件上传,那么通过另一种方法,希望不必“滚动我自己的”功能?

编辑1:

我无法理解如何做出这样的改变是如此困难。当然你可以添加

headers: {'Content-Type': 'multipart/mixed'}

但这绝对没有,因为没有边界。为什么没有办法拉出边界?像

这样的东西
headers: {'Content-Type': 'multipart/mixed, boundary=%b'}

我需要尽快完成这项工作。

1 个答案:

答案 0 :(得分:5)

我再也等不及了。我最终滚动自己,它确实有效。这是代码......希望其他人可以受益。

file_contents是reader.readAsArrayBuffer($ scope.files [0])的输出;

您需要从前导文本,文件数据和页脚构建blob,因为否则将二进制数据附加到字符串将对二进制文件数据进行转换,它将无法正常工作。

var epochTicks = 621355968000000000;
var ticksPerMillisecond = 10000;
var yourTicks = epochTicks + ((new Date).getTime() * ticksPerMillisecond);

var boundary='---------------------------'+yourTicks;

var header="--"+boundary+"\r\n";

var footer="\r\n--"+boundary+"--\r\n";

var contenttype="multipart/mixed; boundary="+boundary;

var contents=header+"Content-Disposition: form-data; name=\"json\"\r\n";
contents+="Content-Type: application/json\r\n";
contents+="Content-Length: "+JSON.stringify(data).length+"\r\n\r\n";
contents+=JSON.stringify(data)+"\r\n";

contents+=header+"Content-Disposition: form-data; name=\"image\"; filename=\""+$scope.files[0].name+"\"\r\n";
contents+="Content-Transfer-Encoding: binary\r\n";
contents+="Content-Type: "+$scope.files[0].type+"\r\n";
contents+="Content-Length: "+$scope.files[0].size+"\r\n\r\n";

blob=new Blob([contents,file_contents,footer]);

$http.post(restUrl+"user/avatar/uploadAvatar",blob,{'headers':{'Content-Type':contenttype}}).
success(function (data, status, headers, config) {
  alert("success!");
}).
error(function (data, status, headers, config) {
  alert("failed!");
});