- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
尝试使用 fileReader.readAsBinaryString 通过 AJAX 将 PNG 文件上传到服务器,精简代码(fileObject 是包含我文件信息的对象);
var fileReader = new FileReader();
fileReader.onload = function(e) {
var xmlHttpRequest = new XMLHttpRequest();
//Some AJAX-y stuff - callbacks, handlers etc.
xmlHttpRequest.open("POST", '/pushfile', true);
var dashes = '--';
var boundary = 'aperturephotoupload';
var crlf = "\r\n";
//Post with the correct MIME type (If the OS can identify one)
if ( fileObject.type == '' ){
filetype = 'application/octet-stream';
} else {
filetype = fileObject.type;
}
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(fileObject.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + e.target.result + crlf + dashes + boundary + dashes;
xmlHttpRequest.setRequestHeader("Content-Type", "multipart/form-data;boundary=" + boundary);
//Send the binary data
xmlHttpRequest.send(data);
}
fileReader.readAsBinaryString(fileObject);
在上传前检查文件的前几行(使用 VI)给了我
上传后显示相同的文件
所以它看起来像是某处的格式/编码问题,我尝试对原始二进制数据使用简单的 UTF8 编码函数
function utf8encode(string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
)
然后在原来的代码中
//Build a HTTP request to post the file
var data = dashes + boundary + crlf + "Content-Disposition: form-data;" + "name=\"file\";" + "filename=\"" + unescape(encodeURIComponent(file.file.name)) + "\"" + crlf + "Content-Type: " + filetype + crlf + crlf + utf8encode(e.target.result) + crlf + dashes + boundary + dashes;
这给了我
的输出
仍然不是原始文件的内容 =(
如何编码/加载/处理文件以避免编码问题,以便 HTTP 请求中接收的文件与上传前的文件相同。
一些其他可能有用的信息,如果我不使用 fileReader.readAsBinaryString() 而使用 fileObject.getAsBinary() 来获取二进制数据,它工作正常。但 getAsBinary 仅适用于 Firefox。我一直在 Firefox 和 Chrome 中测试这个,都在 Mac 上,在两者中得到相同的结果。后端上传由 NGINX Upload Module 处理,再次在 Mac 上运行。服务器和客户端在同一台机器上。我尝试上传的任何文件都会发生同样的事情,我只是选择了 PNG,因为它是最明显的例子。
最佳答案
(以下是迟到但完整的回答)
FileReader.readAsBinaryString()
已弃用。不要使用它! 它不再在 W3C File API working draft 中:
void abort();
void readAsArrayBuffer(Blob blob);
void readAsText(Blob blob, optional DOMString encoding);
void readAsDataURL(Blob blob);
注意:请注意 File
是一种扩展 Blob
结构。
Mozilla 仍然执行 readAsBinaryString()
并在 MDN FileApi documentation 中对其进行了描述:
void abort();
void readAsArrayBuffer(in Blob blob); Requires Gecko 7.0
void readAsBinaryString(in Blob blob);
void readAsDataURL(in Blob file);
void readAsText(in Blob blob, [optional] in DOMString encoding);
背后的原因readAsBinaryString()
我认为弃用如下:JavaScript 字符串的标准是 DOMString
它只接受 UTF-8 字符,不接受随机二进制数据。所以不要使用 readAsBinaryString(),那根本不安全且不符合 ECMAScript。
我们知道 JavaScript 字符串不应该存储二进制数据 但 Mozilla 在某种程度上可以。我认为这很危险。 Blob
和 typed arrays
( ArrayBuffer
和尚未实现但不是必需的 StringView
)是出于一个目的而发明的:允许使用纯二进制数据,不受 UTF-8 字符串限制。
XMLHttpRequest.send()
具有以下调用选项:
void send();
void send(ArrayBuffer data);
void send(Blob data);
void send(Document data);
void send(DOMString? data);
void send(FormData data);
XMLHttpRequest.sendAsBinary()
具有以下调用选项:
void sendAsBinary( in DOMString body );
sendAsBinary() 不是标准,Chrome 可能不支持。
所以你有几个选择:
send()
FileReader.result
的 FileReader.readAsArrayBuffer ( fileObject )
.操作起来更复杂(您必须为其创建一个单独的 send()),但这是推荐的方法。send()
FileReader.result
的 FileReader.readAsDataURL( fileObject )
.它会产生无用的开销和压缩延迟,需要在服务器端执行解压缩步骤,但它很容易在 Javascript 中作为字符串进行操作。sendAsBinary()
FileReader.result
的 FileReader.readAsBinaryString( fileObject )
MDN指出:
The best way to send binary content (like in files upload) is using ArrayBuffers or Blobs in conjuncton with the send() method. However, if you want to send a stringifiable raw data, use the sendAsBinary() method instead, or the StringView (Non native) typed arrays superclass.
关于javascript - fileReader.readAsBinaryString 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7431365/
这是我的代码: var reader = new FileReader(); reader.onload = function(e) { download(reader.result, "Te
您好,我正在使用 javascript 上的文件 API 制作我的第一个项目,这是一个简单的程序,它将文件作为输入并在 Div 上显示其内部代码。我想知道是否有办法让这段代码在没有事件监听器和事件处理
尝试使用 fileReader.readAsBinaryString 通过 AJAX 将 PNG 文件上传到服务器,精简代码(fileObject 是包含我文件信息的对象); var fileRead
我想将图像以二进制形式保存到用户本地主机以供将来引用,然后在以后从该二进制文件生成一个 dataurl,问题是,它不起作用。 var reader = new FileReader(); reader
我有一个以下格式的文件: utf-8 encoded text block separator binary data block 我使用 JavaScript 的 FileReader 使用 将文件
使用 filereader API通过使用 readAsDataURL 读取文件,可以显示文件的预览。 我想做的是: 用户选择一个文件 显示预览,以便用户获得一些反馈。 如果用户满意,他将数据提交到后
我目前正在关注this tutorial用于从 javascript 将图像上传到 Google Drive。该示例代码运行良好,您可以选择要从硬盘上传的文件。我现在尝试根据我的目的修改它,以便它以标
似乎readAsBinaryString ,JavaScript FileReader 对象的方法,在 IE10 中不受支持。我已按照 this HTML5 Rocks article 中的建议尝试了
本页http://www.html5rocks.com/en/tutorials/file/dndfiles/如果您向下滚动到示例“示例:切片文件。试试吧!”您将看到使用 readAsBinarySt
我正在使用 reader.readAsArrayBuffer() 将文件发送到 node.js,以便我可以将其保存在/public 文件夹中。 reader.readAsArrayBuffer(eve
如果有输入类型文件 和一张图片 如果选择了一个文件,我想从图像中读取 Exif 数据并将其加载到 img 标签中。 var $inputFile = $("#file"); $inputFile.
简而言之,我想将图像的二进制数据发送到我的处理程序,该处理程序将作为字节数组保存在数据库中。在我的 Javascript 中使用 readAsBinaryString(f) 读取文件输入的值,我将得到
完整代码在 https://gist.github.com/992562 . 我正在使用 HTML 文件 API 并通过拖放将文件通过 XHR post 上传到 PHP 脚本。在程序上,一切似乎都正常
文件读取器。 readAsBinaryString()返回 UTF-8 编码的二进制字符串。我如何才能获取作为一系列 Unicode 转义序列 (\uxxxx) 的数据? 最佳答案 FileReade
以下代码适用于 Chrome 浏览器。 $('#file').change(function(e) { var fileReader = new FileReader(), f
如何等到onload事件完成 function(){ var filedata=null; reader.onload=function(e){ filedata=e.target.resul
举个例子,当我使用 FileReader API 从文件中读取 π 字符 (\u03C0) 时,当我使用 FileReader 读取它时,我会将 pi 字符返回给我.readAsText(blob)
有没有办法将 HTML Canvas 的内容读取为二进制数据? 目前我有以下 HTML 来显示输入文件和它下面的 Canvas : Get Image Content Input: Canvas 然后
我正在尝试解析 xls 文件,请参见下面的文件 https://filebin.net/jm37356p8nkzgycm 获取错误 无法在“FileReader”上执行“readAsBinaryStr
在 HTML5 中,引入了 FileReader API。我无法真正理解 readAsBinaryString() 和 readAsDataURL() 之间的区别。我从几个地方阅读了文档,但仍然无法完
我是一名优秀的程序员,十分优秀!