通过JavaScript上传文件:服务器上的文件无效
File upload via JavaScript: Invalid file on server
我试图上传一个二进制文件(具体来说是PDF)与这个JS-Snippet:
function uploadFile() {
var reader = new FileReader();
var file = document.getElementById('uploadInput').files[0];
console.log(file.size);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'custom?id=upload');
xhr.setRequestHeader("Content-Type", "application/pdf");
xhr.overrideMimeType('application/pdf');
reader.onload = function(evt) {
xhr.send(evt.target.result);
};
reader.readAsBinaryString(file);
}
在服务器端(Java),我正在接收请求并将文件写入磁盘。但是,当打开PDF时,我得到的不是预期的~3MB,而是~4MB,效果是只有空白页。
传入请求的报头还指定了~4MB的Content-Length,所以我相当确定,这是客户端上的东西,这是造成麻烦的原因。
发送纯文本文件完全没有问题,它们到达时完全是它们应该有的样子。
由于编写JavaScript和在网络上工作不是我的日常工作领域,所以很有可能我做了一些根本性的错误。
我觉得有两件事你可以试试:
- 检查进程两端的MIME类型,如果它被弄乱了,你有你的答案
- 您的上传被包装成XMLHttprequest -您可能必须手动Base64编码/解码以摆脱PDF中的本机字节表示
希望这将帮助你,祝你好运!
我找到了解决方案:在发送数据之前明确地用Base64编码,并在接收端适当地解码。
function uploadFile() {
var reader = new FileReader();
var file = document.getElementById('uploadInput').files[0];
console.log(file.size);
var xhr = new XMLHttpRequest();
xhr.open('POST', 'custom?id=upload');
xhr.setRequestHeader("Content-Type", "text/plain; charset=x-user-defined");
xhr.overrideMimeType('text/plain; charset=x-user-defined');
reader.onload = function(evt) {
var encoded = window.btoa(evt.target.result);
xhr.send(encoded);
};
reader.readAsBinaryString(file);
}
我写这篇文章是为了让那些遇到同样问题的人知道我的解决方案。
相关文章:
- 如何使用JavaScript粘贴原始二进制文件而不出现“无效字符”错误
- 数组在手动写入时有效,但从文本文件加载时无效
- 在Rails中使用remote:true在Chrome中有效,但在Safari中无效——从js.erb文件调用succe
- js.erb文件中提供给RegExp构造函数的标志无效
- Apache poi XSSF创建Excel文件-Create返回格式或文件扩展名无效的空文件
- 异步HTTP(ajax)请求在脚本标记中有效,但在js文件中无效
- 当SVG是单独的文件时,剪辑路径/web工具包掩码有效,但在内联时无效
- Jquery文件大小验证无效
- 无效文件的 Blueimp 文件上传错误消息
- 包括来自外部文件的jQuery,有些函数有效,有些则无效
- 如何删除在 Ajax文件上传上出现无效格式的默认警报
- 我不断得到空白值和无效文件
- 将包含内容和元数据的文件上传到谷歌文档会返回400无效/错误请求
- document.write在appendChild添加的Javascript文件中无效
- HTML5异步文件上传,上传的流总是无效的
- 内联javascript有效,但外部文件无效
- 脚本在html中有效,但在javascript文件中无效
- 使用jQuery表单插件上传文件-无效文件错误
- AJAX为HTML表单调用PHP文件无效
- 通过JavaScript上传文件:服务器上的文件无效