Загрузка PDF с сервера [duplicate]

Мне не хватало следующую строку в файле app / build.gradle

apply plugin: 'com.google.gms.google-services'

и после очистки и повторного запуска проекта. Это исправило это для меня.

665
задан Joseph Silber 8 September 2010 в 07:24
поделиться

17 ответов

Вы можете использовать URI данных. Поддержка браузера варьируется; см. Wikipedia . Пример:

<a href="data:application/octet-stream;charset=utf-16le;base64,//5mAG8AbwAgAGIAYQByAAoA">text file</a>

Октетный поток - это принудительное приглашение загрузки. В противном случае он, вероятно, откроется в браузере.

Для CSV вы можете использовать:

<a href="data:application/octet-stream,field1%2Cfield2%0Afoo%2Cbar%0Agoo%2Cgai%0A">CSV Octet</a>

Попробуйте демонстрацию jsFiddle .

360
ответ дан Tom Burris 21 August 2018 в 13:08
поделиться
  • 1
    Это не кросс-браузерное решение, а определенно что-то стоит посмотреть. Например, IE ограничивает поддержку данных uri. IE 8 ограничивает размер до 32 КБ, а IE 7 и ниже вообще не поддерживается. – Darin Dimitrov 8 September 2010 в 07:32
  • 2
    в Chrome версии 19.0.1084.46 этот метод генерирует следующее предупреждение: «Ресурс интерпретируется как Документ, но передается с типом MIME-типа text / csv:» data: text / csv, field1% 2Cfield2% 0Afoo% 2Cbar% 0Agoo% 2Cgai% 0A & quot; ;. & Quot; Загрузка не запускается – Chris 16 May 2012 в 12:44
  • 3
    Теперь он работает в Chrome (протестирован против v20 и v21), но не IE9 (это может быть только jsFiddle, но почему-то я сомневаюсь). – earcam 30 August 2012 в 17:20
  • 4
    Правильная кодировка - это почти наверняка UTF-16, если у вас нет кода, преобразующего его в UTF-8. JavaScript использует UTF-16 внутренне. Если у вас есть текст или CSV-файл, запустите строку с помощью «\ ufeff», отметки байтового заказа для UTF-16BE, а текстовые редакторы смогут правильно читать символы, отличные от ASCII. – larspars 19 November 2014 в 10:06
  • 5
    Просто добавьте download = & quot; txt.csv & quot; атрибут, чтобы иметь правильное имя файла и расширение и сообщить вашей ОС, что с ним делать. – elshnkhll 15 January 2016 в 17:33

Основываясь на ответе @Rick, который был действительно полезен.

Вы должны просмотреть строку data, если хотите поделиться ею следующим образом:

$('a.download').attr('href', 'data:application/csv;charset=utf-8,'+ encodeURI(data));

`Извините Я не могу комментировать ответ @ Rick из-за моей нынешней низкой репутации в StackOverflow.

было предложено .

4
ответ дан atfornes 21 August 2018 в 13:08
поделиться
  • 1
    Я не смог принять это предложение. Странно ... Я обновил код. – Rick 15 June 2016 в 21:22

Я с удовольствием использую FileSaver.js . Совместимость неплохая (IE10 + и все остальное), и это очень просто:

var blob = new Blob(["some text"], {
    type: "text/plain;charset=utf-8;",
});
saveAs(blob, "thing.txt");
98
ответ дан Daniel Buckmaster 21 August 2018 в 13:08
поделиться
  • 1
    К сожалению, IE10 + немного крут ... – Joseph Silber 9 May 2013 в 05:28
  • 2
    Это отлично работает на Chrome. Как разрешить пользователю определять местоположение файла на диске? – gregm 22 May 2013 в 19:40
  • 3
    Вау, спасибо за удобную библиотеку. Это легко лучший ответ, и кто заботится о людях, использующих HTML & lt; 5 в эти дни? – notbad.jpeg 19 June 2013 в 22:16
  • 4
    @gregm Я не уверен, что вы можете с этим плагином. – Daniel Buckmaster 20 June 2013 в 07:23
  • 5
  • 6
    Это БОЛЬШОЕ решение для семейств браузеров IE 10+. IE еще не поддерживает загрузку тега HTML 5, а другие решения на этой странице (и другие страницы SO, обсуждающие ту же проблему) просто не работают для меня. FileSaver ftw! – TMc 12 January 2015 в 21:32

Это решение извлекается непосредственно из репозитория github tiddlywiki (tiddlywiki.com). Я использовал tiddlywiki почти во всех браузерах, и он работает как шарм:

function(filename,text){
    // Set up the link
    var link = document.createElement("a");
    link.setAttribute("target","_blank");
    if(Blob !== undefined) {
        var blob = new Blob([text], {type: "text/plain"});
        link.setAttribute("href", URL.createObjectURL(blob));
    } else {
        link.setAttribute("href","data:text/plain," + encodeURIComponent(text));
    }
    link.setAttribute("download",filename);
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

Github repo: Загрузите модуль хранителя

8
ответ дан Danielo515 21 August 2018 в 13:08
поделиться
  • 1
    Он отлично работает в Chrome, но не в Firefox. Он делает файл и загружает его, но файл пуст. Без содержания. Любые идеи почему? Не тестировали на IE ... – Narxx 16 February 2017 в 17:26
  • 2
    кроме того, что функция не имеет имени, это мой любимый – Yoraco Gonzales 20 August 2018 в 20:32

Следующий метод работает в IE11 +, Firefox 25+ и Chrome 30 +:

<a id="export" class="myButton" download="" href="#">export</a>
<script>
    function createDownloadLink(anchorSelector, str, fileName){
        if(window.navigator.msSaveOrOpenBlob) {
            var fileData = [str];
            blobObject = new Blob(fileData);
            $(anchorSelector).click(function(){
                window.navigator.msSaveOrOpenBlob(blobObject, fileName);
            });
        } else {
            var url = "data:text/plain;charset=utf-8," + encodeURIComponent(str);
            $(anchorSelector).attr("download", fileName);               
            $(anchorSelector).attr("href", url);
        }
    }

    $(function () {
        var str = "hi,file";
        createDownloadLink("#export",str,"file.txt");
    });

</script>

См. это в действии: http://jsfiddle.net/Kg7eA/

URI браузера Firefox и Chrome для навигации, который позволяет нам создавать файлы, перейдя на URI данных, в то время как IE не поддерживает его в целях безопасности.

С другой стороны, IE имеет API для сохранения blob, который может использоваться для создания и загрузки файлов.

19
ответ дан dinesh ygv 21 August 2018 в 13:08
поделиться
  • 1
    Для этого требуется jQuery. – Dan Dascalescu 5 November 2016 в 22:07
  • 2
    Я просто использовал jquery для присоединения событий (onclick и onready) и установки атрибутов, которые вы также можете использовать с vanilla JS. Для основной части (window.navigator.msSaveOrOpenBlob) не требуется jquery. – dinesh ygv 6 November 2016 в 03:17
  • 3
    По-прежнему существует ограничение размера для подхода данных uri, не так ли? – flipperweid 26 June 2017 в 08:21

Решение, которое работает на IE10: (мне нужен файл csv, но этого достаточно, чтобы изменить тип и имя файла на txt)

var csvContent=data; //here we load our csv data 
var blob = new Blob([csvContent],{
    type: "text/csv;charset=utf-8;"
});

navigator.msSaveBlob(blob, "filename.csv")
7
ответ дан Dzarek 21 August 2018 в 13:08
поделиться

Как уже упоминалось ранее, filesaver - отличный пакет для работы с файлами на стороне клиента. Но с большими файлами это не очень хорошо. StreamSaver.js является альтернативным решением (которое указано в FileServer.js), которое может обрабатывать большие файлы:

const fileStream = streamSaver.createWriteStream('filename.txt', size);
const writer = fileStream.getWriter();
for(var i = 0; i < 100; i++){
    var uint8array = new TextEncoder("utf-8").encode("Plain Text");
    writer.write(uint8array);
}
writer.close()
4
ответ дан Erik 21 August 2018 в 13:08
поделиться
  • 1
    Текстовый кодировщик сейчас очень экспериментальный, я предлагаю избегать (или полифорирования) его. – Brandon.Blanchard 22 September 2017 в 20:07

Если файл содержит текстовые данные, метод, который я использую, заключается в том, чтобы поместить текст в элемент textarea и выбрать его пользователем (щелкните в textarea, затем ctrl-A), затем скопируйте, а затем вставьте в текстовый редактор.

-19
ответ дан HBP 21 August 2018 в 13:08
поделиться
  • 1
    Я подумал об этом, но с точки зрения удобства общения это катастрофически. Кроме того, файл должен быть сохранен с расширением CSV. Попробуйте сообщить об этом своим пользователям. – Joseph Silber 8 September 2010 в 08:07

Все вышеприведенные примеры отлично работают в chrome и IE, но не работают в Firefox. Пожалуйста, обратите внимание на добавление привязки к телу и удаление его после нажатия.

var a = window.document.createElement('a');
a.href = window.URL.createObjectURL(new Blob(['Test,Text'], {type: 'text/csv'}));
a.download = 'test.csv';

// Append anchor to body.
document.body.appendChild(a);
a.click();

// Remove anchor from body
document.body.removeChild(a);
148
ответ дан HoldOffHunger 21 August 2018 в 13:08
поделиться
  • 1
    Однако: есть открытая ошибка в IE 10 (и я все еще видел ее в 11) , которая бросает & quot; Access is denied & quot; на линии a.click(), поскольку он считает, что URL-адрес blob является перекрестным. – Matt 16 December 2014 в 20:44
  • 2
    @Matt data uri - это перекрестное происхождение в некоторых браузерах. насколько я знаю, не только в msie, но и в хроме. вы можете проверить его, пытаясь ввести javascript с данными uri. Он не сможет получить доступ к другим частям сайта ... – inf3rno 13 September 2015 в 00:13
  • 3
    «Все вышеприведенные примеры отлично работают в chrome и IE, но не работают в Firefox». Поскольку порядок ответов может меняться со временем, неясно, какие ответы были выше ваших, когда вы написали это. Можете ли вы точно указать, какие подходы не работают в Firefox? – Kevin 2 April 2018 в 18:57

Простое решение для готовых браузеров HTML5 ...

function download(filename, text) {
  var element = document.createElement('a');
  element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
  element.setAttribute('download', filename);

  element.style.display = 'none';
  document.body.appendChild(element);

  element.click();

  document.body.removeChild(element);
}
form * {
  display: block;
  margin: 10px;
}
<form onsubmit="download(this['name'].value, this['text'].value)">
  <input type="text" name="name" value="test.txt">
  <textarea name="text"></textarea>
  <input type="submit" value="Download">
</form>

Использование

download('test.txt', 'Hello world!');
538
ответ дан mikemaccana 21 August 2018 в 13:08
поделиться
  • 1
    Ага. Это именно то, что @MatthewFlaschen размещено здесь около 3 лет назад . – Joseph Silber 12 August 2013 в 23:01
  • 2
    Да, но с атрибутом download вы можете указать имя файла ;-) – Matěj Pokorný 12 August 2013 в 23:08
  • 3
    Поскольку @earcam уже указал в комментариях выше . – Joseph Silber 13 August 2013 в 01:30
  • 4
    Chrome только добавляет расширение txt, если вы не предоставляете расширение в имени файла. Если вы сделаете download("data.json", data), он будет работать так, как ожидалось. – Carl Smith 19 July 2014 в 15:34
  • 5
    В chrome, если я использую ваш код вне формы отправки и, например, назвал свой файл * .js, хром сообщит мне его вредоносное ПО. Любая идея, как это исправить? – Scotow 18 May 2016 в 17:22

На самом деле это возможно - используйте Flash.

Вы можете либо сгенерировать контент с помощью JS, а затем инициализировать некоторые флеш-вары или просто сделать все в флеш-ролике.

Пожалуйста, возьмите посмотрите на этот для некоторых важных замечаний.

-29
ответ дан Mr.RoyDiibs 21 August 2018 в 13:08
поделиться
  • 1
    Смотрите также эту тему: stackoverflow.com/questions/1811736/… – Mr.RoyDiibs 8 September 2010 в 07:56
  • 2
    Я должен был указать это в моем вопросе, но я ищу собственное решение. В противном случае я мог бы использовать ActiveX (хотя он будет работать только в IE). – Joseph Silber 8 September 2010 в 08:07
  • 3
    Я считаю, что такая функциональность намеренно заблокирована – Mr.RoyDiibs 8 September 2010 в 08:20
  • 4
    Поскольку пользователю будет предложено загрузить его или нет, я не понимаю, почему его намеренно блокировать. Кроме того, с точки зрения безопасности это должно быть не иначе, как обычная загрузка HTTP. По крайней мере, AFAIK ... – Joseph Silber 8 September 2010 в 08:28
  • 5
    Flash не поддерживается на мобильных устройствах – Yassir Ennazk 4 October 2013 в 10:38

Вы даже можете сделать это лучше, чем просто URI. Используя Chrome, вы также можете предложить имя, которое будет принимать файл, как описано в в этом сообщении в блоге об именовании загрузки при использовании URI .

3
ответ дан owencm 21 August 2018 в 13:08
поделиться

По состоянию на апрель 2014 года API-интерфейсы FileSytem не могут быть стандартизованы в W3C.

Погоны HTML5 голова вверх

Список рассылки W3C по API FileSytem

4
ответ дан pravin 21 August 2018 в 13:08
поделиться

Если вы просто хотите преобразовать строку, которая будет доступна для загрузки, вы можете попробовать это с помощью jQuery.

$('a.download').attr('href', 'data:application/csv;charset=utf-8,' + encodeURI(data));
8
ответ дан Rick 21 August 2018 в 13:08
поделиться

Все вышеупомянутые решения не работали во всех браузерах. Вот что, наконец, работает на IE 10+, Firefox и Chrome (и без jQuery или любой другой библиотеки):

save: function(filename, data) {
    var blob = new Blob([data], {type: 'text/csv'});
    if(window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveBlob(blob, filename);
    }
    else{
        var elem = window.document.createElement('a');
        elem.href = window.URL.createObjectURL(blob);
        elem.download = filename;        
        document.body.appendChild(elem);
        elem.click();        
        document.body.removeChild(elem);
    }
}

Обратите внимание, что в зависимости от вашей ситуации вы также можете вызвать URL.revokeObjectURL после удаления elem. Согласно документам для URL.createObjectURL :

Каждый раз, когда вы вызываете createObjectURL (), создается новый URL-адрес объекта, даже если вы уже создали его для тот же объект. Каждый из них должен быть освобожден, вызывая URL.revokeObjectURL (), когда они вам больше не нужны. Браузеры автоматически освободят их, когда документ будет выгружен; однако, для оптимальной производительности и использования памяти, если есть безопасные моменты, когда вы можете явно их выгружать, вы должны это сделать.

140
ответ дан Smi 21 August 2018 в 13:08
поделиться
  • 1
    Бесконечно благодарен. Я пробовал все приведенные здесь примеры, и только он работает с любым браузером. Это должен быть принятый ответ. – LEM 27 May 2016 в 16:51
  • 2
    В Chrome у меня не было необходимости добавлять элемент в тело, чтобы заставить его работать. – JackMorrissey 5 July 2016 в 16:29
  • 3
    Для приложений AngularJS 1.x вы можете создать массив Urls по мере их создания, а затем очистить их в функции $ onDestroy компонента. Это отлично работает для меня. – Splaktar 6 September 2016 в 18:12
  • 4
    Что такое данные? это encodeURI(content)? – Tjorriemorrie 4 January 2017 в 03:11
  • 5
    Другие ответы привели к Failed: network error в Chrome. Это хорошо работает. – juniper- 27 September 2017 в 19:25
var element = document.createElement('a');
element.setAttribute('href', 'data:text/text;charset=utf-8,' +      encodeURI(data));
element.setAttribute('download', "fileName.txt");
element.click();
5
ответ дан Soner Gönül 21 August 2018 в 13:08
поделиться
  • 1
    Каковы различия между этим подходом и созданием Blob? – Dan Dascalescu 5 November 2016 в 22:08
0
ответ дан abdul 1 November 2018 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: