2014-01-08 91 views
4

嗨,我正在下載使用Chrome擴展選定的鏈接,但我無法設置下載位置。所有的網址都下載到Chrome的默認位置。我知道我們不能這樣做是因爲安全原因。我們可以在這裏提示在Chrome擴展彈出窗口中的目錄選擇器對話框,用戶可以選擇下載路徑。需要我的任何信息讓我知道。如何設置Chrome擴展的文件下載位置使用JavaScript?

這可能嗎?有關如何解決它的任何建議?

在此先感謝 我的代碼

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, arrayOfUrl,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, urls,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,urls,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, binaryData, {base64: true}); 
       zip.file(fileName+".docx", binaryData, {base64: true}); //file"+count+".docx" 
       if (count < urls.length -1){ 
        count++; 
        downloadFile(urls[count], onDownloadComplete, urls,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 
        }); 
} 
+0

你看過** ['chrome.d ownloads.download()'](http://developer.chrome.com/extensions/downloads.html#method-download)**? – gkalpak

+0

是的,我知道,但我想提供一些關於此的更多信息。我正在使用JsZip庫構建一個包含所有可下載文件的zip文件。我需要在擴展彈出窗口中提示目錄選擇器路徑,以便保存zip文件的位置。它可能嗎?提供任何鏈接和示例代碼來完成this.and我的代碼看到我更新的問題 –

+0

@ExpertSystem是我更新的代碼給你任何想法?讓我知道你是否需要進一步的信息。使用FileSystem API可以做到這一點因爲這是緊急的 –

回答

1

既然你生成和下載只是一個ZIP文件,你可以使用chrome.downloads.download()方法。例如: -

var content = zip.generate(); 
var zipName = 'download.zip'; 
var dataURL = 'data:application/zip;base64,' + content; 
chrome.downloads.download({ 
    url:  dataURL, 
    filename: zipName, 
    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'] 
}); 
+0

感謝您的回覆。「SaveAs:true」總是要求選擇保存目錄(我們要保存文件的位置).Can我們只有在點擊下載按鈕時纔會問第一次。我不想總是問。 –

+0

我在這裏觀察到的另一件事情是,當點擊擴展彈出窗口中的下載按鈕時,saveAs彈出窗口即將關閉,並在我選擇目的地(我想要保存文件的位置)之前立即關閉。任何想法?爲什麼它會發生。如何解決這個問題? –

+0

你能解釋一下關於彈出問題的更多信息...... –

相關問題