您好:我正在编写一个 firefox 扩展(我的第一个扩展),除其他外,将图像 url 读入字节数组,然后将该二进制信息写入文件。我用过this example ,看起来好像可以,但文件不正确,好像对其执行了某种字符转换。
我的版本如下:
testWriteBinaryFile : function (dir, filename, data) {
var aFile = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
aFile.initWithPath( "/home/mike/mypicture.gif" );
aFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0600);
Firebug.Console.log("Binary writing: file set up");
var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].
createInstance(Components.interfaces.nsIFileOutputStream);
stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate
Firebug.Console.log("Binary writing: stream set up");
Firebug.Console.log("Data length: " + data.length);
Firebug.Console.log("Data byte 0: " + data[0].toString(16));
Firebug.Console.log("Data byte 1: " + data[1].toString(16));
Firebug.Console.log("Data byte 2: " + data[2].toString(16));
Firebug.Console.log("Data byte 3: " + data[3].toString(16));
Firebug.Console.log("Data byte 4: " + data[4].toString(16));
stream.write(data, data.length);
Firebug.Console.log("Binary writing: stream written")
if (stream instanceof Components.interfaces.nsISafeOutputStream) {
stream.finish();
} else {
stream.close();
}
Firebug.Console.log("Binary writing: done.");
}
通过打印出前几个字节,我知道数据缓冲区本身是可以的,但是文件一旦在磁盘上就完全不同了。写出二进制文件的任何想法或任何其他方法?
我知道这是同步写入,但文件很小,(20Kb)...但这是唯一的例子。如果我能解决这个问题,我就完成了扩展!任何帮助表示赞赏。
最佳答案
您在此处拥有的代码可以正常工作 - 例如如果 data
是 "foo\0\n\rbar"
,则该字符串已正确写入磁盘。也许问题是 nsIOutputStream.write()
需要一个字符串作为参数,但是你说的是字节数组。如果您的 data
变量确实是字节数组,那么首先将其转换为字符串可能是最简单的方法:
data = String.fromCharCode.apply(String, data);
之后操作data
是一个对应于原始字节数组的字符串,可以和nsIOutputStream.write()
一起使用。更有效(但在这种情况下可能不必要)的方法是使用 nsIBinaryOutputStream ,像这样:
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var stream = FileUtils.openSafeFileOutputStream(aFile, FileUtils.MODE_WRONLY |
FileUtils.MODE_CREATE);
var binaryStream = Components.classes["@mozilla.org/binaryoutputstream;1"]
.createInstance(Components.interfaces.nsIBinaryOutputStream);
binaryStream.setOutputStream(stream);
binaryStream.writeByteArray(data, data.length);
FileUtils.closeSafeFileOutputStream(stream);
我正在使用 FileUtils module在此示例中,它使事情变得简单得多。
关于javascript - 从 javascript(Firefox 插件)写入二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9315587/