在扩展内使用 Ajax 可引入 jQuery 库。
下载使用 chrome.downloads API,此 API 只能在 background 中使用,content_scripts 中使用会报错。所以在 content_scripts 中获取到要下载的资源后,通过消息(chrome.runtime.sendMessage() API)发送给 background 进行下载。
使用 downloads API 需要在 manifest 文件配置 permissions :
"permissions": [
"downloads",
"storage"
],
这段是从另外的应用里摘出来的
/*
0 - (未初始化)还没有调用send()方法
1 - (载入)已调用send()方法,正在发送请求
2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
3 - (交互)正在解析响应内容
4 - (完成)响应内容解析完成,可以在客户端调用了
@see https://xhr.spec.whatwg.org/
*/
function ajaxRequest(curhost, rurl, isFinished){
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function (){
if(xhr.readyState == 1) {
//alert( '请稍等正在刷新...' );
}
if (xhr.readyState == 2) {
if(isFinished == 'ok'){
//通知重载页面
flushFinished();
return '';
}else{
ajaxRequest(curhost, rurl, 'ok');
}
}
};
xhr.open("GET",curhost + rurl + id, true);
xhr.send();
}
下载调用的 API :
chrome.downloads.download({
url: url,
filename: filename,
conflictAction: 'uniquify',
saveAs: false
},
function(res){
});
自己封装后,配合选项页使用:
//保存文件方式
var _ex_save_conflict = 'overwrite';
chrome.storage.local.get('_ex_favpicture_likename', function(valueArray) {
if( valueArray._ex_favpicture_likename ){
if( valueArray._ex_favpicture_likename == 'prompt' || valueArray._ex_favpicture_likename == 'uniquify' ){
_ex_save_conflict = valueArray._ex_favpicture_likename;
}
}
});
//保存图片
/*
{
url: 下载文件的url,
filename: 保存的文件名,
conflictAction: 重名文件的处理方式,uniquify 括号防重,overwrite 覆盖,prompt 弹窗让用户决定
saveAs: 是否弹出另存为窗口,
method: 请求方式(POST或GET),
headers: 自定义header数组,
body: POST的数据
}
*/
function _exSavePicture(url, filename){
chrome.downloads.download({
url: url,
filename: filename,
conflictAction: _ex_save_conflict,
saveAs: false
}, function(res){ });
}
每次调用下载是单文件的,所以一组数据/对象 要循环调用。