使用Ajax POST,Multipart内容和JSON有效负载上载文件

时间:2014-03-20 16:44:15

标签: javascript jquery json multipartform-data

有一个REST服务,可以上传文件。我必须使用以下有效负载构造POST请求,例如:

Content-Type: multipart/form-data; boundary= ---1234567890
-----1234567890
Content-Disposition: form-data; name="parameters"
Content-Type: application/json

{
"parentID":"FB4CD874EF94CD2CC1B60B72T0000000000100000001"
}
-----1234567890
Content-Disposition: form-data; name="primaryFile"; filename="example.txt"
Content-Type: text/plain

<File Content>
-----1234567890--

看起来很简单。第一部分是JSON对象,它描述了服务器上应该保存文件的位置,第二部分是文件本身。 (请注意,我无权修改服务器。)

经过大量的谷歌搜索,我发现我可以使用FormData对象来创建这个多部分请求。这是我的代码:

function checkInNewFile(folderId, file)
{
  var response;
  var fd = new FormData();

  var parent = new Blob(['{ "parentID": "' + folderId + '" }"'], { type: "application/json"});
  fd.append("parameters", parent, null);

  fd.append("primaryFile", file);

  var jqXHR =
    $.ajax(
      {
        type: "POST",
        url: someURL,
        async: false,

        data: fd,
        processData: false,
        contentType: false
      }
    );
  jqXHR.done( function (data) { response = data; });
  return response;
}

生成的请求几乎是预期的...文件内容是正确的,但我无法准确创建第一部分。实际上,上面的代码产生了第一部分:

-----1234567890
Content-Disposition: form-data; name="parameters"; filename=""
Content-Type: application/json

{
"parentID":"FB4CD874EF94CD2CC1B60B72T0000000000100000001"
}

如您所见,请求中还有一个额外的文件名属性,虽然实际名称为空,但我的服务器不喜欢此表单中的请求。

当然我尝试添加一个简单的文本值作为第一部分:

  var parent = '{ "parentID" : "' +  folderId + '" }';
  fd.append("parameters", parent);

但现在请求如下:

-----1234567890
Content-Disposition: form-data; name="parameters"

{ "parentID":"FB4CD874EF94CD2CC1B60B72T0000000000100000001" }

即。缺少Content-Type,服务器不接受它。

我试图将数据添加为对象,但它根本没有帮助,无论是Content-type还是实际的JSON表示,或两者都缺失。

阅读FormData文档,我没有找到任何其他选择。我不知道足够的JavaScript从头开始重写FormData。

有什么想法吗?

0 个答案:

没有答案