在我的 FF 扩展中,我创建了一个从 DOM 检索数据的对象(一个字符串)。
现在我需要下载一个带有字符串内容的纯文本文件。结果应该是一个 CSV 文件。
我读到了addDownload
方法,但我错过了很多……有什么提示吗?
主要是我不知道如何:
在可下载的对象(文件?)中“转换”我的字符串
正确调用
addDownload
方法(nsIURI 等)
非常感谢你的帮助。
在我的 FF 扩展中,我创建了一个从 DOM 检索数据的对象(一个字符串)。
现在我需要下载一个带有字符串内容的纯文本文件。结果应该是一个 CSV 文件。
我读到了addDownload
方法,但我错过了很多……有什么提示吗?
主要是我不知道如何:
在可下载的对象(文件?)中“转换”我的字符串
正确调用addDownload
方法(nsIURI 等)
非常感谢你的帮助。
这是我的扩展的一部分,它显示了另存为对话框,因此用户可以选择正确的位置(您可以跳过该部分或尝试找出应该自动放置下载的位置)
const nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window, "Save as", nsIFilePicker.modeSave);
fp.appendFilters(nsIFilePicker.filterHTML);
fp.appendFilters(nsIFilePicker.filterAll);
var rv = fp.show();
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
var file = fp.file;
// work with returned nsILocalFile...
// Check that it has some extension
var name = file.leafName;
if (-1==name.indexOf('.'))
file.leafName = name + '.html' ;
// file is nsIFile, data is a string
var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"]
.createInstance(Components.interfaces.nsIFileOutputStream);
// use 0x02 | 0x10 to open file for appending.
foStream.init(file, 0x02 | 0x08 | 0x20, 0666, 0);
// write, create, truncate
foStream.write(data, data.length);
foStream.close();
你有很多方法。老式的方法是直接操作nsIFile
,nsIFileOutputStream
尽管您不能以这种方式写入空字节。您还可以nsIStringInputStream
从您的字符串创建一个并将其写入您的输出流,或者您可以使用nsIAsyncStreamCopier
异步复制它。FileUtils.jsm
并NetUtil.jsm
存在试图让这对你更容易。
但是,如果您的目标是足够新的 Firefox 版本,则可以忽略所有这些并改用OS.File
API。