嗨我正在使用chrome扩展名下载所选链接,但我无法设置下载位置.所有网址都下载到chrome的默认位置.我知道由于安全原因我们不能这样做.我们可以从这里提示Chrome扩展弹出窗口中的目录选择器对话框用户可以选择下载路径.需要我方的任何信息让我知道.
这有可能吗?有关如何去做的任何建议?
提前致谢
我的代码
function downloadFile(url,onSuccess,arrayOfUrl,zip) { var xhr = new XMLHttpRequest(); xhr.open('GET',url,true); xhr.responseType = "blob"; xhr.onreadystatechange = function () { if (xhr.readyState == 4) { if (onSuccess) { onDownloadComplete(xhr.response,zip) } } } xhr.send("null"); } function onDownloadComplete(blobData,urls,zip ){ if (count < urls.length) { blobToBase64(blobData,function(binaryData){ var fileName = urls[count].substring(urls[count].lastIndexOf('/')+1); zip.file(fileName+".docx",binaryData,{base64: true}); if (count < urls.length -1){ count++; downloadFile(urls[count],onDownloadComplete,zip); } else { var content = zip.generate(); var zipName = 'download.zip'; var a = document.createElement('a'); a.href = "data:application/zip;base64," + content; a.download = zipName; a.click(); count = 0; } }); } }
popup.js
function onDownloadComplete(blobData,zip ){ if (count < urls.length) { blobToBase64(blobData,function(binaryData){ // add downloaded file to zip: var fileName = urls[count].substring(urls[count].lastIndexOf('/')+1); // zip.file(fileName,{base64: true}); zip.file(fileName+".docx",{base64: true}); //file"+count+".docx" if (count < urls.length -1){ count++; downloadFile(urls[count],zip); } else { chrome.runtime.getBackgroundPage(function () { zipAndSaveFiles(zip);}); } }); } } **background.js** function zipAndSaveFiles(zip) { var content = zip.generate(zip); var zipName = 'download.zip'; var dataURL = 'data:application/zip;base64,' + content; chrome.downloads.download({ url: dataURL,filename: zipName,saveAs: true }); }
解决方法
由于您只生成和下载一个ZIP文件,因此可以使用
chrome.downloads.download()
方法.例如.:
var content = zip.generate(); var zipName = 'download.zip'; var dataURL = 'data:application/zip;base64,' + content; chrome.downloads.download({ url: dataURL,saveAs: true }); count = 0;
如果省略SaveAs对话框的显示,则只能指定位于用户定义的下载文件夹内或其子文件夹中的文件名.
关于弹出窗口的问题(见下面的评论):
你应该从你的后台页面调用该函数,而不是弹出窗口.例如.您可以使用chrome.runtime.sendMessage
/onMessage
将消息传递到您的后台页面:
在background.js中:
... function zipAndSaveFiles(...) { ... } chrome.runtime.onMessage.addListener(function(msg,sender) { if ((msg.action === 'zipAndSave') && (msg.params !== undefined)) { zipAndSaveFiles(msg.params); } });
在popup.js中:
... chrome.runtime.sendMessage({ action: 'zipAndSave',params: ['url1','url2','url3'] });