Frage

Ich bin derzeit eine Erweiterung für Google Chrome zu schaffen, die alle Bilder oder Links zu Bildern auf der Festplatte speichern können.

Das Problem ist, ich weiß nicht, wie mit JS oder mit Google Chrome Extension API-Datei auf der Festplatte zu speichern.

Haben Sie eine Idee?

War es hilfreich?

Lösung

Sie können mit HTML5 Filesystem verfügt über zu schreiben auf die Festplatte die mit < a href = "http://updates.html5rocks.com/2011/08/Downloading-resources-in-HTML5-a-download" rel = "noreferrer"> Download API. Das ist der einzige Weg, um Download-Dateien auf der Festplatte und es ist begrenzt.

Sie können einen Blick auf NPAPI Plugin nehmen. Eine weitere Möglichkeit, zu tun, was Sie brauchen, ist einfach eine Anfrage an eine externe Website über XHR POST senden und dann einen anderen GET-Anforderung die Datei wieder abgerufen werden, die als eine Datei speichern Dialog angezeigt wird.

Zum Beispiel für meine Browser-Erweiterung Mein Hangout ich ein Dienstprogramm zum Download erstellt ein Foto von HTML5 Canvas direkt auf der Festplatte. Sie können auf den Code werfen Sie einen Blick hier capture_gallery_downloader.js den Code, der tut das heißt:

var url = window.webkitURL || window.URL || window.mozURL || window.msURL;
var a = document.createElement('a');
a.download = 'MyHangouts-MomentCapture.jpg';
a.href = url.createObjectURL(dataURIToBlob(data.active, 'jpg'));
a.textContent = 'Click here to download!';
a.dataset.downloadurl = ['jpg', a.download, a.href].join(':');

Wenn Sie die Umsetzung der Umwandlung einer URI auf einen Blob in HTML5 hier möchte ist, wie ich es tat:

/**
 * Converts the Data Image URI to a Blob.
 *
 * @param {string} dataURI base64 data image URI.
 * @param {string} mimetype the image mimetype.
 */
var dataURIToBlob = function(dataURI, mimetype) {
  var BASE64_MARKER = ';base64,';
  var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
  var base64 = dataURI.substring(base64Index);
  var raw = window.atob(base64);
  var rawLength = raw.length;
  var uInt8Array = new Uint8Array(rawLength);

  for (var i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i);
  }

  var bb = new this.BlobBuilder();
  bb.append(uInt8Array.buffer);
  return bb.getBlob(mimetype);
};

Dann, nachdem der Benutzer klickt auf dem Download-Button, wird es den "Download" HTML5 File API verwenden, um den Blob-URI in eine Datei zum Download bereit.

Andere Tipps

Ich hatte lange schon gewünscht eine Chrome-Erweiterung, um für mich zu Batch-Download Bildern. Doch jedes Mal, wenn ich frustriert werde, weil das nur scheinbar anwendbar Option NPAPI ist, die beide Chrome und Firefox scheinen nicht in der Unterstützung nicht mehr wünschen zu haben.

Ich schlage vor, diejenigen, die wollten immer noch implementieren ‚save-Datei-on-disk‘ Funktionalität einen Blick auf diese zu haben, Stackoverflow Post , der Kommentar unter diesem Beitrag Hilfe mir viel.

Nun, da Chrom 31+ wurde die chrome.downloads API stabil. Wir können es verwenden, um programm-Datei herunterladen. Wenn der Benutzer nicht die ask me before every download Voraus Option in Chrom Einstellung eingestellt hat, können wir Datei, ohne den Benutzer zu bestätigen speichern!

Hier ist, was ich verwende (im Hintergrund Seite Erweiterung):

    // remember to add "permissions": ["downloads"] to manifest.json
    // this snippet is inside a onMessage() listener function
    var imgurl = "https://www.google.com.hk/images/srpr/logo11w.png";
    chrome.downloads.download({url:imgurl},function(downloadId){
        console.log("download begin, the downId is:" + downloadId);
    });

Obwohl es ist schade, dass Chrom immer noch keine Event bereitstellt, wenn der Callback-Funktion Download-completes.chrome.downloads.download aufgerufen wird, wenn der Download erfolgreich begin (nicht abgeschlossen)

Die offizielle Dokumentation über chrome.downloadsis hier .

Es ist nicht meine ursprüngliche Idee über die Lösung, aber ich hier gepostet Hoffnung, dass es von Nutzen für jemanden sein kann.

Es gibt keine Möglichkeit, die ich kenne, um leise speichert Dateien auf das Laufwerk des Benutzers, das ist, was es scheint, wie Sie zu tun hoffen. Ich glaube, Sie können für Dateien ASK zu einer nach dem anderen gespeichert werden (Aufforderung an den Benutzer jedes Mal) mit so etwas wie:

function saveAsMe (filename)
{
document.execCommand('SaveAs',null,filename)
}

Wenn Sie nur den Benutzer auffordern, einmal wollte, könnte man leise alle die Bilder greifen, zip sie in einem Bündel, dann, dass die Benutzer herunterladen haben. Dies könnte zu tun XmlHttpRequest auf alle Dateien bedeuten, sie in Javascript zu zippen, UPLOADING sie zu einem Staging-Bereich, und dann den Benutzer zu fragen, ob sie die Zip-Datei herunterladen möchten. Klingt absurd, ich weiß.

Es gibt lokale Speicheroptionen im Browser, aber sie sind nur für die Verwendung des Entwicklers, die Sandbox, soweit ich weiß. (ZB Google Mail offline-Caching.) Siehe jüngste Ankündigungen von Google wie diesem .

Betrachten Sie die Verwendung von HTML5 Filesystem dieser Marke Schreiben verfügt, um Dateien möglich mit Javascript.

Google Webstore
Github

Ich habe eine Erweiterung, die so etwas wie dies der Fall ist, wenn jemand hier ist immer noch interessiert. Es verwendet einen XMLHTTPRequest um das Objekt zu greifen, die in diesem Fall angenommen wird, um ein Bild zu sein, macht dann eine ObjectURL, um es, einen Link zu diesem ObjectURL, und klickt auf der gedachte Verbindung.

Da Javascript hitch-Wanderungen auf Ihren Computer mit Web-Seiten von nur etwa irgendwo , wäre es gefährlich, ihm die Fähigkeit zu schreiben, um die Festplatte zu geben.

Es ist nicht erlaubt. Denken Sie, dass die Chrome-Erweiterung Benutzerinteraktion erfordern? Andernfalls könnte es in die gleiche Kategorie fallen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top