通过原型 Ajax 调用提交二进制数据
Submit binary data via Prototype Ajax call
我正在使用原型提交POST请求,postdata包含许多字段,其中一个是文件中的二进制数据(在这种情况下,用户选择上传的Excel电子表格。
我正在使用HTML5 FileReader界面通过FileReader.readAsBinaryString()
获取文件的内容,这运行良好。 如果我使用 charCodeAt()
打印字符串中的各种字符,那么它们就会得到预期的值。
但是,一旦我将此字符串数据放在一个对象中(以及其他表单字段)并将其作为parameters
选项传递给原型的Ajax.Request()
,数据到达时已损坏。 某些字符值(如 0x82
)将替换为 0xC2 0x82
,0xAC
将替换为 0xC2 0xAC
,依此类推。
我尝试使用 window.atob()
对字符串进行 base64 编码,但这在 InvalidCharacterError: String contains an invalid character
时失败,所以显然我需要避免某种处理。
有谁知道如何通过 Prototype 的Ajax.Request()
传递二进制数据,同时在同一请求中包含其他表单字段?
要执行 ajax 文件上传,您应该真正使用 FormData 对象
var data = new FormData();
//var data = new FormData(someForm); if all your fields is in an html form
// add fields to form
data.append('fieldname',fieldvalue);
data.append('filefieldname',fileobject);
//etc
new Ajax.Request(url, {
contentType: null,
method: 'post',
postBody: data,
onSuccess: successFunction
})
使用此方法,服务器将看到请求,就像它是由具有属性enctype="multipart/form-data"
的表单发送的一样
这样做需要魔法和小精灵尘埃。(其实不然)
首先,您需要将表单字段值作为URL参数而不是POST,然后用文件内容覆盖POST正文。例如
new Ajax.Request('/url.php?rawupload=1&id='+$F('id')+'&label='+label,
{
'method':'post',
'postBody':fileobject,
'onSuccess':function() { alert('success'); }
});
fileobject
是从文件上传输入元素检索的 HTML5 文件对象
是的,如果您有很多表单字段,它不是最优雅的解决方案。如果您确实有很多表单字段来构建查询字符串,而不是手动执行,也可以使用 Hash#toQueryString
http://api.prototypejs.org/language/Hash/prototype/toQueryString/
- Javascript生成的表单未提交
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- HTML表单提交时未执行外部函数
- 在POST中将html表作为csv提交
- 我应该使用Ng提交还是点击表格
- 我想使用模态通过php文件发送邮件,并且我希望在提交关闭后关闭pop
- 如何将PDF作为二进制文件传递到window.open()
- 提交后保留下拉选择的值
- 键入最后一位数字后自动提交
- 阻止表单元素提交
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- Jquery提交表单而不刷新
- 将图像上传ajax与表单提交ajax相结合
- 如何将字母转换为二进制代码
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- 自定义表单验证和提交
- 带有验证和隐藏字段值的提交按钮
- 如何在 API 调用后和 if 语句中启用提交按钮
- 从XHR下载二进制文件数据,然后重新提交
- 通过原型 Ajax 调用提交二进制数据