【问题标题】:What encoding is used for multipart/form-data and is it possible to encode data using JQuery?多部分/表单数据使用什么编码,是否可以使用 JQuery 对数据进行编码?
【发布时间】:2012-09-07 21:02:40
【问题描述】:

我实际上想使用 jQuery 将图片发送到我的服务器,而不使用 html 表单。但我想检索与我收到的带有编码类型的 html 表单相同的数据:

multipart/form-data

我使用了 HTML5 FileReader:http://www.html5rocks.com/en/tutorials/file/dndfiles/

但是当我使用FileReader.readAsText(Blob|File, opt_encoding) 函数时。我检索到的数据与使用 html 表单编码的数据不同。

“multipart/form-data”使用什么编码,是否可以在将数据发送到我的服务器之前使用 jquery 或 javascript 对数据进行编码?

//编辑

来自 w3schools:http://www.w3schools.com/html5/att_form_enctype.asp

multipart/form-data ==> 没有字符被编码。当您使用具有文件上传控件的表单时,此值是必需的

我遇到的问题是,当我从 FileReader 检索数据时,它与来自 HTML 表单数据的数据不同。

对于同一张图片: 使用 html 表单:

\xff\xd8\xff\xe1\x00\x18Exif\x00\x00II*\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xec\x00\x11Ducky\x00\x01\x00\x04\x00\x00\x00U\x00\x00\xff\xe1\x03)http://ns.adobe.com/xap/1.0/\x00<?xpacket begin="\xef\xbb\xbf" id="W5M0MpCehiHzreSzNTczkc9d"?>...

使用 FileReader.readAsText():

\xc3\xbf\xc3\x98\xc3\xbf\xc3\xa1\\u0000\\u0018Exif\\u0000\\u0000II*\\u0000\\b\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\xc3\xbf\xc3\xac\\u0000\\u0011Ducky\\u0000\\u0001\\u0000\\u0004\\u0000\\u0000\\u0000U\\u0000\\u0000\xc3\xbf\xc3\xa1\\u0003)http://ns.adobe.com/xap/1.0/\\u0000<?xpacket begin=\\"\xc3\xaf\xc2\xbb\xc2\xbf\\" id=\\"W5M0MpCehiHzreSzNTczkc9d\\"?>

如何检索相同的数据?

【问题讨论】:

标签: jquery file-upload encoding multipartform-data


【解决方案1】:

您应该使用FileReader.readAsBinaryString 来获取非文本文件的文件内容。

此外,当您尝试发送将被编码的数据时,为防止这种情况,您可以使用 XMLHttpRequest.sendAsBinary ,它是非标准的,仅在 Gecko(firefox) 中可用。这是一个使用 Uint8Array 的 polyfill

if (!XMLHttpRequest.prototype.sendAsBinary){
    XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
        function byteValue(x) {
            return x.charCodeAt(0) & 0xff;
        }
        var ords = Array.prototype.map.call(datastr, byteValue);
        var ui8a = new Uint8Array(ords);
        this.send(ui8a.buffer);
    }
}

当然这都是微不足道的,因为支持 File Api 和 Uint8Array 的浏览器也支持FormData

【讨论】:

  • 我用FileReader.readAsBinaryString检索到完全相同的信息,实际上我的客户端和我的服务器之间的编码没有区别......
  • 我认为只是FileReader的功能并没有提供与HTML Form相同的编码。问题是:如何检索相同的编码?
【解决方案2】:

好吧,我实际上在测试很多解决方案时找到了答案,而我发现的那个有点奇怪。

实际上,我使用函数FileReader.readAsDataURL()将数据以Base64格式发送到我的服务器。

然后,我 split(',') 数据只在我的服务器端获取 Base64 数据我使用 my_base64_data_decoded = base64.b64decode(my_base64_data_encoded) 解码数据

起初我使用“boto”将这些数据发送到亚马逊,并使用:cStringIO.StringIO(my_base64_data_decoded) 序列化数据,但它不起作用。

我创建了一个字典my_dict

我做了my_dict['data'] = base64.b64decode(my_base64_data_encoded)

然后:cStringIO.StringIO(my_dict['data']) 并且成功了。

现在我的问题是在插入字典时对数据做了什么处理?

但至少,我找到了答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多