2013-02-20 33 views
0

在我的FF扩展中,我创建了一个从DOM中检索数据的对象(一个字符串)。将带有Mozilla Firefox扩展的字符串对象内容下载为纯文本文件

现在我需要下载一个带有字符串内容的纯文本文件。结果应该是一个CSV文件。

我读了addDownload方法,但我错过了很多件...任何提示?

主要是我不知道如何:

  1. 在下载对象 “转换” 我的字符串

  2. 正确调用addDownload方法(nsIURI等)

    (文件?)

非常感谢您的帮助。

+0

所以你真正想做的是写一个字符串到一个文件? – Neil 2013-02-21 10:29:05

+0

是的,我从字符串中收集DOM中的一些内容,并且需要下载包含该内容的文本文件。如果字符串可能成为问题,我可以将内容存储在其他类型的对象中。 – enricostn 2013-02-21 14:39:29

回答

0

您有很多方法。老派的方式是直接操纵nsIFilensIFileOutputStream,尽管你不能以这种方式写空字节。您也可以从字符串创建nsIStringInputStream并将其写入输出流,或者使用nsIAsyncStreamCopier异步复制它。 FileUtils.jsmNetUtil.jsm的存在是为了让你更容易。但是,如果您打算使用足够新的Firefox版本,则可以忽略所有这些,并使用OS.File API代替。

+0

所以我不需要使用'addDownload'方法? https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDownloadManager#addDownload%28%29 – enricostn 2013-02-22 19:32:25

+0

不,对于除了从互联网下载文件以外的其他任何内容,这都没有什么用处。 – Neil 2013-02-22 23:32:50

0

这是我的扩展的一部分,它显示另存为对话框,以便用户可以选择正确的位置(你可以跳过这一部分或试图找出其中的下载应自动放置)

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(); 
相关问题