Добрый день, уважаемые знатоки!
Есть у меня отличное самописное расширение для Хрома, допиливаемое неспешно "на коленке" вот уже несколько лет.
И по ряду причин, возникла необходимость портировать его (хотя бы в урезанном виде) под ФФ.
И одна из функций, которое реализует расширение, была выгрузка распарсенной сводной информации о публикациях со страниц одного узкоспециального сайта в виде простого текста.
Реализовано было до безобразия просто, см. ниже. Закомментаренное — это реализация в хромовском расширении, предыдущая строка — переделанное под ДОМ расширений ФФ.
В контент-скрипте:
function DownloadFile(options){
console.log("DownloadFile", options);
browser.runtime.sendMessage({ type: "download", url: options.url, filename: options.filename } );
// chrome.extension.sendMessage({ type: 'download', url: url, filename: filename });
}
...
var filecontent = aParsedPage.pubauthor + "\n" + aParsedPage.pubnumber + "\n" +
aParsedPage.pubdate + "\n" + aParsedPage.pubname + "\n" +
aParsedPage.pubdesc;
var url = 'data:application/txt;charset=utf-8,' + encodeURIComponent(filecontent);
var filename = fileprefix + 'descr.txt';
DownloadFile({ url: url, filename: filename });
И в бэкграунд скрипте:
browser.runtime.onMessage.addListener(MessageHandler);
//chrome.extension.onMessage.addListener(MessageHandler);
function MessageHandler(request, sender, callback){
console.log("MеssageHandler", request.type, request);
switch (request.type) {
case "download":
chrome.downloads.download({
url: request.url,
filename: request.filename,
saveAs: false
});
break;
default:
break;
}
}
Сразу скажу, что если функции DownloadFile передаются обычные сетевые URL протокола http(s) — оба варианта (и Хромовский, и ФФ) отлично отрабатывают. Сформированные строки-URLы выглядят в отладчике абсолютно одинаково, как и целевые имена файлов для загрузки. Все оттестировано и работает совершенно корректно и аналогично одинаково — за исключением маленькой детали.
Именно при подстановке вместо URL сформированной на лету строки данных — в Хроме ожидаемо загружается в дефолтной папке текстовый файл, а в ФФ — ничего не происходит вообще. Просто молча игнорируется и продолжается выполнение скрипта.
Что уже было опробовано:
1) добавление в манифест <ALL_URLS>
2) попытка формировать URL через BLOB:
var filecontent = aParsedPage.pubauthor + "\n" + aParsedPage.pubnumber + "\n" +
aParsedPage.pubdate + "\n" + aParsedPage.pubname + "\n" +
aParsedPage.pubdesc;
var oMyBlob = new Blob([ filecontent ] , {type : 'application/txt;charset=utf-8'}); // the blob
var url = URL.createObjectURL(oMyBlob );
В любых вариантах просто молча ничего не происходит, без выдачи каких-либо ошибок и предупреждений. И в варианте №2 к тому строка не формируется ожидаемым образом.
На данный момент, идеи у меня иссякли, гугление также не выдает ничего нового. Дальше без данной функции продолжать разработку смысла также нет, т.к. она по сути базовая.
Что скажет уважаемый ALL?
EP>Что скажет уважаемый ALL?
Скачать файл можно и безо всяких downloads.download:
var el = document.createElement('a');
el.href = 'data:attachment/text,' + base64data;
el.target = '_blank';
el.download = '1.txt';
el.click();
Здравствуйте, L.K., Вы писали:
EP>>Что скажет уважаемый ALL?
LK>Скачать файл можно и безо всяких downloads.download:
Безусловно, можно. Но неужели есть такая мысль, что ради скачивания ОДНОГО файла, городилось целое расширение?
Производится скачка большого количества файлов в автоматическом режиме. Которые складываются
в упорядоченную структуру каталогов, и сопровождаются текстовыми описаниями. Ключевая фраза выделена. Аттрибут "download" позволяет задать только имя файла, но не путь, так что все валится гамузом а папку "download". Разгребать и упорядочивать потом это ручками... Слишком дофига времени и смысла не имеет.
Собственно, без описаний — это хаотический бесполезный набор информации. Описания генерируются из контента сайта "на лету".
У меня как бы уже родилась идея обхода — на каком-то серваке запустить скрипт, который всего-то будет на запрос типа "
http://meserver.com/get.php?some_long_text" будет выдавать это самое some_long_text, обёрнутое в миме-тип "application/text". Но это слишком уж заковыристо, хотелось бы проще.
К тому же я не питаю иллюзий по поводу своей гениальности, так что если бы поставленная задача в самом деле была неразрешима более простым путём, подобный сервис давно уже кто-то бы сделал.
Здравствуйте, EugenePerfect, Вы писали:
EP>В любых вариантах просто молча ничего не происходит, без выдачи каких-либо ошибок и предупреждений. И в варианте №2 к тому строка не формируется ожидаемым образом.
Старость — не радость. Все же не молча он меня шлёт в сад:
Приостановлено на исключении
Error: Type error for parameter options (Error processing url: Error: Access denied for URL data:application/txt;charset=utf-8****
Если вам нужно сохранить файл, то и пользуйтесь нужным API FF для этого.
Если API нет, то ничего не выйдет, ибо FF очень строг в безопасности.