如何在HTTP多部分POST请求中发送包含Blob的数据?

3
我正在使用多部分XMLHttpRequest来上传文件到Google Drive帐户,使用谷歌文档中描述的语法:https://developers.google.com/drive/web/manage-uploads#multipart。这是请求正文的简化示例。
--delim
Content-Type: application/json; charset=UTF-8

*metadata Json object*

--delim
Content-Type: *datatype*

*data*
--delim--

我的问题是:

  • 我正在使用JavaScript
  • 我必须将数据发送为Blob
  • 我不能使用Google的JavaScript API
  • 它必须与Internet Explorer兼容(至少9)。

正如您所看到的,请求由2个字符串组成,中间有一个Blob。
但是,如果我像“a-”+ blob +“-b”这样连接字符串,我当然会得到字符串“a-[object Blob] -b”

那么,我该如何发送包含blob和元数据的请求呢?

P.S.:我知道我可以单独发送数据,然后编辑元数据,但需要两个请求,
这太麻烦了...


你尝试过发送一个包含Blob的FormData对象吗? - Renzo Poddighe
哦,我忘了说它需要在IE 9上运行,抱歉... - tuxlu
2个回答

2
我找到了答案,我需要对Blob的内容进行Base 64编码:

我发现答案,我需要对我的Blob的内容进行Base 64编码:

var reader = new FileReader
reader.readAsDataURL(blob)
var data = reader.result;
//don't need type informations
data = data.split(",").pop();

在请求的第二部分中,“Content-Type”值后面,我添加了这一行:

'Content-Transfer-Encoding: base64'

现在它可以工作了!

不用担心,在我的代码中,我以异步方式使用了我的FileReader,这里只是为了简洁而简化了。


0

FormData对象工作得非常好,但不兼容IE < 10。

对于版本9及以下的IE,需要使用不同的解决方案。 这个问题的最佳答案建议使用jQuery Form Plugin作为替代方案,该插件与较低版本的IE兼容。

经过进一步检查,该插件似乎为所有不符合标准的浏览器模拟了FormData对象。可以在此处找到独立的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接