首页 编程 正文
258

download file via chrome extension

  • yiqingpeng
  • 2019-02-21
  • 0
  •  
首先配置manifest.json文件,添加download权限:
{
	"manifest_version": 2,
	"name": "download artworks",
	"description": "download artworks",
	"version": "1.1",
	"update_url": "http://example.com",
	"background": {
		"scripts": ["js/main.js"]
	},
	"icons":{
		"16":"img/icon.png",
		"48":"img/icon.png",
		"128":"img/icon.png"
	},
	"permissions": [
		"https://debugger.eu2.netsuite.com/*",
                "downloads"
	],
	"browser_action": {
		"default_icon": {
                        "16":"img/icon.png",
                        "48":"img/icon.png",
                        "128":"img/icon.png"
                },
		"default_title": ""
	},
	"content_scripts":[
		
	]
}
创建main.js作为background js, 注意,如果manifest.json中的broser_action项配置了default_pop页面,那么插件将不响应click事件,而是打开设置的pop页面。因为我们此次要达到的效果是在点击插件时便开始执行下载,所以去掉了default_pop选项,并在main.js中设置了browserAction.onClicked的监听器。代码如下:
chrome.browserAction.onClicked.addListener(function (tab){
    chrome.tabs.executeScript(tab.id, {
        file: "js/jquery.min.js",
        allFrames: true,
        runAt: "document_idle"
    });
    chrome.tabs.executeScript(tab.id, {
        file: "js/content.js",
        allFrames: true,
        runAt: "document_idle"
    });
});

chrome.downloads.onCreated.addListener(function (item){
    
});
chrome.downloads.onDeterminingFilename.addListener(function (item, __suggest){
    var filename;
    var searchParams = new URLSearchParams(item.url.replace(/.*\?/,''));
    var proofId = searchParams.get('proofid');
    var fname = searchParams.get('custfilename');
    console.log(fname);
    if (fname) {
        filename = fname + '.meta';
        __suggest({filename: 'artworks/' + proofId + '/' + filename,conflict_action: 'overwrite',conflictAction: 'overwrite'});
    } else {
        filename = item.filename;
        __suggest({filename: 'artworks/' + proofId + '/' + filename,conflict_action: 'overwrite',conflictAction: 'overwrite'});
    }
});
chrome.extension.onRequest.addListener(function(data) {
    chrome.downloads.download({url: data[0], 
    conflictAction:'overwrite'});
});
可以在main.js中引入其它脚本,比如jquery等。 content.js负责解析页面dom,并将需要下载的url传递给main.js,因为只有在main.js中才能调用download相关api. 在main.js中利用chrome.extension.onRequest来监听页面脚本投递的消息(消息体可以是string,array,object等)。 而在content.js中,利用chrome.extension.sendRequest(mixedType)来向main.js发送消息。 chrome.downloads.onDeterminingFilename用来重写下载文件名,conflictAction选项用来处理文件名冲突的处理方式。 注意,downloads下载的文件只会放在浏览器设置的下载目录下,如果在onDeterminingFilename中,将文件名前面加上子目录名的话,会自动创建此子目录。 content.js代码如下:
var currSearch = new URLSearchParams(window.location.search.replace(/^\?/, ''));
var proofId = currSearch.get('id');
var fileId = currSearch.get('justfileid');

function foreachLink(callback){
    
    jQuery('#custom3_form .smalltext').each(function (i, ele){
        if (i % 2 === 0 ) {
            var fname = ele.innerText.replace(/^preview/i, '').trim();
            var fid = ele.getAttribute('onclick').replace(/^preview\(/,'').replace(/\,.+$/,'');
            
            if (fileId && fileId != fid) return;
            console.log('File id&name: ' + fid + ',' + fname);
            downloadMeta(fname, fid);
        } else {
            var fid = new URLSearchParams(ele.href.replace(/.*\?/,'')).get('id');
            if (fileId && fileId != fid) return;
            console.log('File download: ' + ele.href);
            download(ele);
        }
    });
}
function sendDownloadUrl(url){
    chrome.extension.sendRequest([url + '&proofid=' + proofId]);
}
function download(ele){
    sendDownloadUrl(ele.href);
    //ele.click();
}
function downloadMeta(filename, fileid){
    var metaDataUrl = 'https://xxxx.com/app/site/hosting/scriptlet.nl?script=151&deploy=1&fileid=' + fileid;
    sendDownloadUrl(metaDataUrl + '&custfilename=' + encodeURIComponent(filename));
    /*
    jQuery.getJSON(metaDataUrl, function(data){
        //console.log(data);
    });
    fetch(metaDataUrl).then(function(response) {
        //console.log(response);
        if(response.ok) {
            response.blob().then(function(myBlob) {
                var blob = new Blob([myBlob]);
                var url = window.URL.createObjectURL(blob);
                
                var aBtn = document.createElement('a');
                aBtn.href = url ;
                aBtn.download = decodeURIComponent(filename);
                //aBtn.click();
                download(aBtn)
            });
        } else {
            alert(filename + ' download error.');
        }
    });*/
}
foreachLink();

正在加载评论...