有一个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。
有什么想法吗?