这个问题也适用于mp3和wav文件。
我已经建立了一个express.js服务器,基本上发送所需的文件如下:
res.sendFile('someImage.png', {root: './images'});
然后在客户端,我收到图像:
var req = new XMLHttpRequest();
...
req.onreadystatechange = function(e) {
if(req.readyState != 4) return;
...
writeMyFile(null, e.target.response, someCallback);
}
...
所以在回复中我确实有我的文件。我想把这个文件写入我的本地文件系统。我按如下方式实现写:
var writeMyFile = function(err, file, someCallback) {
this.dir.getFile('myImages/someImage.png', {create: true}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
var blob = new Blob([file], {type: 'image/png'});
fileWriter.write(blob);
}, someCallback);
}, someCallback);
};
执行这些后,我看到在myImages文件夹中创建了一个png文件。但它的大小是原始文件的两倍,并且被操作系统认为已损坏。预览无法查看图像。同样适用于mp3 / wav文件,它们是两倍大小,不会在任何玩家等上播放。
我在这里做错了什么?如何将这些文件适当地写入文件系统?
当文件是json对象时,上面的代码非常有效。我们怀疑可能存在编码问题,但到目前为止还不知道修复。
最后,我正在使用闭包编译器。
感谢您的帮助。
答案 0 :(得分:0)
在解决问题之后,我发现了解决方案非常简单。所以这是供将来参考。
在Xhr请求中,确保在发送请求之前将responseType设置为arrayBuffer或blob。在我的情况下,它是arrayBuffer,因为我已经有一个blob构建器,它将对收到的数据进行操作。那就是:
...
req.responseType = 'arraybuffer';
req.onreadystatechange = ...
req.send();
事实证明,blob构造中的Mime Type不会影响要写入的这些二进制文件。在我的情况下,我可以完美地存储mp3歌曲,其中我的MIME为:' image / png'。但是我不确定这是否还有其他影响,我只是简单地说,无论我设置哪种类型,文件都能正常工作。