Cordova / Phonegap如何将PNG文件写入文件系统?

时间:2015-05-13 19:20:31

标签: image cordova express binary-data fileapi

这个问题也适用于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对象时,上面的代码非常有效。我们怀疑可能存在编码问题,但到目前为止还不知道修复。

最后,我正在使用闭包编译器。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

在解决问题之后,我发现了解决方案非常简单。所以这是供将来参考。

在Xhr请求中,确保在发送请求之前将responseType设置为arrayBuffer或blob。在我的情况下,它是arrayBuffer,因为我已经有一个blob构建器,它将对收到的数据进行操作。那就是:

...
req.responseType = 'arraybuffer';
req.onreadystatechange = ...
req.send();

事实证明,blob构造中的Mime Type不会影响要写入的这些二进制文件。在我的情况下,我可以完美地存储mp3歌曲,其中我的MIME为:' image / png'。但是我不确定这是否还有其他影响,我只是简单地说,无论我设置哪种类型,文件都能正常工作。

相关问题