Расширение Chrome: Как сохранить файл на диске

В настоящее время я создаю расширение для Google Chrome, которое может сохранять все изображения или ссылки на изображения на жестком диске.

Проблема в том, что я не знаю, как сохранить файл на диске с помощью JS или Google Chrome Extension API.

У тебя есть идея?

7 ответов

Решение

Вы можете использовать функции файловой системы HTML5 для записи на диск с помощью API загрузки. Это единственный способ загрузки файлов на диск, и он ограничен.

Вы можете взглянуть на плагин NPAPI. Еще один способ сделать то, что вам нужно, это просто отправить запрос на внешний веб-сайт через XHR POST, а затем еще один запрос GET, чтобы получить файл обратно, который появится в виде диалога сохранения файла.

Например, для расширения моего браузера My Hangouts я создал утилиту для загрузки фотографии из HTML5 Canvas непосредственно на диск. Вы можете взглянуть на код здесь capture_gallery_downloader.js код, который делает это:

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(':');

Если вы хотите реализовать преобразование URI в BLOB-объект в HTML5, вот как я это сделал:

/**
 * 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);
};

Затем, после того как пользователь нажмет на кнопку загрузки, он будет использовать "загрузку" HTML5 File API для загрузки URI большого двоичного объекта в файл.

Я давно хотел сделать расширение Chrome для себя, чтобы загружать изображения в пакетном режиме. Тем не менее, каждый раз, когда я расстраивался, потому что единственный, казалось бы, применимый вариант - это NPAPI, который, похоже, и Chrome, и Firefox больше не хотят поддерживать.

Тем, кто все еще хотел реализовать функциональность "сохранить файл на диске", я рекомендую взглянуть на этот пост Stackru, мне очень помогают комментарии ниже этого поста.

Теперь, поскольку Chrome 31+, chrome.downloads API стал стабильным. Мы можем использовать его для программной загрузки файла. Если пользователь не установил ask me before every download Опция предварительной настройки в настройках Chrome, мы можем сохранить файл без запроса подтверждения пользователем!

Вот что я использую (на странице фона расширения):

    // 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);
    });

Хотя жаль, что хром до сих пор не обеспечивает Event когда загрузка завершится.chrome.downloads.downloadфункция обратного вызова вызывается при загрузке begin успешно (не завершено)

Официальная документация о chrome.downloads здесь

Это не мое первоначальное представление о решении, но я написал здесь в надежде, что оно кому-нибудь пригодится.

Я не знаю, как сохранить файлы на диск пользователя в автоматическом режиме, как вы, похоже, и надеетесь. Я думаю, что вы можете попросить сохранить файлы по одному (каждый раз запрашивая пользователя), используя что-то вроде:

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

Если вы хотите запросить у пользователя только один раз, вы можете молча захватить все изображения, заархивировать их в пакет, а затем попросить пользователя загрузить их. Это может означать выполнение XmlHttpRequest для всех файлов, архивирование их в Javascript, ЗАГРУЗКА их в промежуточную область, а затем запрос пользователя, хотят ли они загрузить ZIP-файл. Звучит абсурдно, я знаю.

В браузере есть опции локального хранилища, но, насколько я знаю, они предназначены только для разработчика, внутри песочницы. (Например, автономное кэширование Gmail.) Смотрите последние объявления от Google, как этот.

Интернет-магазин Google
Github

Я сделал расширение, которое делает что-то вроде этого, если кто-то здесь все еще заинтересован. Он использует XMLHTTPRequest для захвата объекта, который в этом случае считается изображением, затем создает для него ObjectURL, ссылку на этот ObjectUrl и нажимает на воображаемую ссылку.

Подумайте об использовании функций файловой системы HTML5, которые делают возможным запись в файлы с помощью Javascript.

Похоже, чтение и запись файлов из браузеров стало возможным. Некоторые новые браузеры на основе Chromium могут использовать «API собственной файловой системы». В этом сообщении в блоге 2020 года показаны примеры кода для чтения и записи в локальную файловую систему с помощью JavaScript.

https://blog.merzlabs.com/posts/native-file-system/

Эта ссылка показывает, какие браузеры поддерживают API собственной файловой системы.

https://caniuse.com/native-filesystem-api

Поскольку Javascript подключается к вашему компьютеру с помощью веб-страниц практически из любой точки мира, было бы опасно давать ему возможность записи на ваш диск.

Это не разрешено. Вы думаете, что расширение Chrome потребует взаимодействия с пользователем? В противном случае он может попасть в ту же категорию.

Другие вопросы по тегам