Tworzenie rozszerzenia Chrome Pobierz plik

Tworzę rozszerzenie, które pobierze plik mp3 ze strony internetowej. Próbuję to zrobić, tworząc nową kartę z linkiem do pliku mp3, ale chrome wciąż otwiera ją wewnątrz odtwarzacza zamiast go pobierać. Czy jest jakiś sposób, aby utworzyć wyskakujące okienko, aby poprosić Użytkownika o "zapisanie" pliku?

Author: Franz Payer, 2011-01-30

5 answers

Przewijanie do przodu 3 lata, a teraz Google Chrome oferuje chrome.downloads API (od Chrome 31).

Po zadeklarowaniu "downloads" uprawnień w manifeście, można zainicjować pobieranie za pomocą tego wywołania:

chrome.downloads.download({
  url: "http://your.url/to/download",
  filename: "suggested/filename/with/relative.path" // Optional
});

Jeśli chcesz wygenerować zawartość pliku w skrypcie, możesz użyć Blob oraz URL APIs, np.:

var blob = new Blob(["array of", " parts of ", "text file"], {type: "text/plain"});
var url = URL.createObjectURL(blob);
chrome.downloads.download({
  url: url // The object URL can be used as download URL
  //...
});

Aby uzyskać więcej opcji (np. Zapisz jako okno dialogowe, nadpisanie istniejących plików itp.), patrz dokumentacja.

 123
Author: Xan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-19 07:18:08

Użyłem wariacji na temat rozwiązania TUTAJ

var downloadCSS = function () {
    window.URL = window.webkitURL || window.URL;
    file = new BlobBuilder(); //we used to need to check for 'WebKitBlobBuilder' here - but no need anymore
    file.append(someTextVar); //populate the file with whatever text it is that you want
    var a = document.createElement('a');
    a.href = window.URL.createObjectURL(file.getBlob('text/plain'));
    a.download = 'combined.css'; // set the file name
    a.style.display = 'none';
    document.body.appendChild(a);
    a.click(); //this is probably the key - simulatating a click on a download link
    delete a;// we don't need this anymore
}

Jedną z rzeczy, o której musisz pamiętać, jest to, że ten kod musi być wykonywany na stronie, a nie na Twoim rozszerzeniu - w przeciwnym razie użytkownik nie zobaczy akcji pobierania, którą wykonuje chrome. Pobieranie nadal będzie się odbywać i będzie można go zobaczyć na karcie pobierania, ale nie będzie widać rzeczywistego pobierania.

Edit (afterthought about make your code execute on the content page):

The way you aby na stronie zawartości wystąpiła akcja zamiast rozszerzenia, należy użyć Chrome "message passing" . Zasadniczo przekazujesz wiadomość z rozszerzenia (które jest prawie jak osobna strona) do strony zawartości, z którą działa rozszerzenie. Następnie masz odbiornik, który Twoje rozszerzenie wstrzyknęło do strony zawartości, która reaguje na wiadomość i pobiera. Coś takiego:

chrome.extension.onMessage.addListener(
  function (request, sender, sendResponse) {  
      if (request.greeting == "hello") {
          try{
              downloadCSS();
          }
          catch (err) {
              alert("Error: "+err.message);
          }
      }
  });
 13
Author: Steve Mc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:05

Jest to nieco zmodyfikowana wersja odpowiedzi @ Steve ' a Mc, która przekształca ją w uogólnioną funkcję, którą można łatwo skopiować i użyć tak, jak jest:

function exportInputs() {
    downloadFileFromText('inputs.ini','dummy content!!')
}

function downloadFileFromText(filename, content) {
    var a = document.createElement('a');
    var blob = new Blob([ content ], {type : "text/plain;charset=UTF-8"});
    a.href = window.URL.createObjectURL(blob);
    a.download = filename;
    a.style.display = 'none';
    document.body.appendChild(a);
    a.click(); //this is probably the key - simulating a click on a download link
    delete a;// we don't need this anymore
}
 10
Author: AmanicA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-10 20:42:03

Oto zwięzły sposób na pobranie pliku za pomocą uprawnień "downloads" w manifeście Chrome przy użyciu @Xan i rozwiązania @AmanicA

function downloadFile(options) {
    if(!options.url) {
        var blob = new Blob([ options.content ], {type : "text/plain;charset=UTF-8"});
        options.url = window.URL.createObjectURL(blob);
    }
    chrome.downloads.download({
        url: options.url,
        filename: options.filename
    })
}

// Download file with custom content
downloadFile({
  filename: "foo.txt",
  content: "bar"
});

// Download file from external host
downloadFile({
  filename: "foo.txt",
  url: "http://your.url/to/download"
});
 9
Author: Apoorv Saxena,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-06 10:14:50

Zrobiłem to w następujący sposób w appmator kod na Github.

Podstawowym podejściem jest zbudowanie Bloba, jak chcesz (Chrome ma responseBlob na XmlHttpRequest, więc możesz go używać), utwórz ramkę iframe (hidden, display:none), a następnie przypisz src ramki iframe jako Blob.

Spowoduje to rozpoczęcie pobierania i zapisanie go w systemie plików. Jedynym problemem jest to, że nie możesz jeszcze ustawić nazwy pliku.

var bb = new (window.BlobBuilder || window.WebKitBlobBuilder)();

var output = Builder.output({"binary":true});
var ui8a = new Uint8Array(output.length);

for(var i = 0; i< output.length; i++) {
  ui8a[i] = output.charCodeAt(i);
}

bb.append(ui8a.buffer);

var blob = bb.getBlob("application/octet-stream");
var saveas = document.createElement("iframe");
saveas.style.display = "none";

if(!!window.createObjectURL == false) {
  saveas.src = window.webkitURL.createObjectURL(blob); 
}
else {
  saveas.src = window.createObjectURL(blob); 
}

document.body.appendChild(saveas);

Przykład użycia responseBlob XmlHttpRequest (zobacz: http://www.w3.org/TR/XMLHttpRequest2/#dom-xmlhttprequest-responseblob )

var xhr = new XmlHttpRequest();
xhr.overrideMimeType("application/octet-stream"); // Or what ever mimeType you want.
xhr.onreadystatechanged = function() {
if(xhr.readyState == 4 && xhr.status == 200) {

  var blob = xhr.responseBlob();
  var saveas = document.createElement("iframe");
  saveas.style.display = "none";

  if(!!window.createObjectURL == false) {
    saveas.src = window.webkitURL.createObjectURL(blob); 
  }
  else {
    saveas.src = window.createObjectURL(blob); 
  }

  document.body.appendChild(saveas);
}
 6
Author: Kinlan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-29 16:21:58