不自重者,取辱。不自长者,取祸。不自满者,受益。不自足者,博闻。
Firefox插件开发中用JS实现文件下载 进入全屏
line

今天收拾电脑,发现有个以前开发Firefox插件时候写的类库----用Javascript实现文件下载。

放到博客上,给自己沉淀一下,以后还会用得上:

var Baidufe = window.Baidufe || {};
 
/**
 * 处理网络文件的操作,如下载等
 * @author 赵先烈
 */
Baidufe.FileNetwork = function(){};
 
/**
 * 获取默认的本地目录
 */
Baidufe.FileNetwork.getDefaultDiretory = function(){
    var file = Components.classes["@mozilla.org/file/directory_service;1"]
                .getService(Components.interfaces.nsIProperties)
                .get("Home",Components.interfaces.nsIFile);
     
    return file.path;
};
 
/**
 * 选择一个本地存储的目录
 */
Baidufe.FileNetwork.selectDirectory = function(){
    const nsIFilePicker = Components.interfaces.nsIFilePicker;
    var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
    fp.init(window,"",nsIFilePicker.modeGetFolder);
    var result = fp.show();
    if(result == nsIFilePicker.returnOK) {
        return fp.file.path;
    } else {
        return null;
    }
};
 
/**
 * 下载文件到本地
 * @param {Object} config   下载参数,格式为:
 * {
 *      uri : "",文件源地址
 *      dir : "" , //本地存储目录
 *      callback : function(file,fileName){}, //下载完成的回调
 *      fileName : ""   //文件名
 * }
 */
Baidufe.FileNetwork.downLoadFile = function(config){
    var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService);
    var fileURI = ios.newURI(config.uri, null, null); 
    var channel = ios.newChannelFromURI(fileURI); 
    var observer = {
        onStreamComplete: function(loader, context, status, length, result){
            var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
            file.initWithPath(config.dir);
            if( !file.exists() || !file.isDirectory() ) { // if it doesn't exist, create
                file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0777);
            }
            file.appendRelativePath(config.fileName);
            var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
            stream.init(file, -1, -1, 0);
            var bstream = Components.classes["@mozilla.org/binaryoutputstream;1"].createInstance(Components.interfaces.nsIBinaryOutputStream);
            bstream.setOutputStream(stream);
            bstream.writeByteArray(result, length);
            if (stream instanceof Components.interfaces.nsISafeOutputStream) {
                stream.finish();
            } else {
                stream.close();
            }
            if (typeof config.callback == "function") {
                config.callback(file, config.fileName);
            }
        }
    };
    var streamLoader = Components.classes["@mozilla.org/network/stream-loader;1"].createInstance(Components.interfaces.nsIStreamLoader);
    streamLoader.init(observer);
    channel.asyncOpen(streamLoader, channel);
};

有需要的,也可以直接拿走。

趣店(原趣分期)技术学院
重点关注技术架构、服务化、优秀工具、自动化平台、开发全流程一体化解决方案、新人培养、工程师进阶之道等方面
这里环境优雅、氛围年轻、主要是福利还多,还等什么?我们敞开技术的大门,欢迎各种工程师加入!

评论区域

line