我实际上想使用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\\"?>
如何检索相同的数据?
答案 0 :(得分:1)
您应该使用FileReader.readAsBinaryString
来获取非文本文件的文件内容。
此外,当您尝试发送数据时,它将被编码,为了防止这种情况,您可以使用XMLHttpRequest.sendAsBinary,它是非标准的,仅在Gecko(firefox)中可用。这是使用Uint8Array
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
答案 1 :(得分:0)
好的,我实际上在测试很多解决方案时找到了答案,而我找到的解决方案有点奇怪。
实际上,我使用函数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'])
并且它有效。
现在我的问题是在插入字典时对数据进行了哪些处理?
但至少,我找到了答案。