Скачать файл используя Javascript / jQuery

358

У меня есть очень похожее требование, указанное здесь .

Мне нужно, чтобы браузер пользователя запускал загрузку вручную, когда $('a#someID').click();

Но я не могу использовать этот window.hrefметод, поскольку он заменяет содержимое текущей страницы файлом, который вы пытаетесь загрузить.

Вместо этого я хочу открыть загрузку в новом окне / вкладке. Как это возможно?

Митхун Шридхаран
источник
Я перепробовал много ответов в смежных вопросах, и это окончательный ответ .
Basj
Настройка window.location.href у меня работает. Также содержимое окна НЕ меняется. Я полагаю, вы использовали неправильный contentType?
BluE

Ответы:

379

Используйте невидимое <iframe>:

<iframe id="my_iframe" style="display:none;"></iframe>
<script>
function Download(url) {
    document.getElementById('my_iframe').src = url;
};
</script>

Чтобы заставить браузер загружать файл, который в противном случае он мог бы отображать (например, HTML или текстовые файлы), необходимо, чтобы сервер установил для MIME-типа файла бессмысленное значение, такое как application/x-please-download-meили альтернативно application/octet-stream, которое используется для произвольного двоичного файла. данные.

Если вы хотите открыть его только на новой вкладке, единственный способ сделать это - щелкнуть ссылку с targetатрибутом, установленным пользователем _blank.

В jQuery:

$('a#someID').attr({target: '_blank', 
                    href  : 'http://localhost/directory/file.pdf'});

При щелчке по этой ссылке файл загружается в новую вкладку / окно.

Рэнди Дев
источник
4
Веб-страница не может открыть новую вкладку автоматически. Чтобы принудительно загрузить браузер, попросите сервер отправить файл pdf с бессмысленным MIME-типом, например application / x-please-download-me
Randy the Dev
14
Красиво сделано! Решает проблему хорошо. Тем не менее, вы можете использовать: так iframe.style.display = 'none'; как это будет полностью скрыть iframe. Ваша текущая реализация сделает iframe невидимым, но iframe все равно будет занимать место внизу страницы, вызывая дополнительные пробелы.
Акрикос
2
Это "полу" работает для меня. Я создал следующий простой тестовый html: <html> <body> <iframe src = "fileurl"> </ iframe> </ body> </ html> и он действительно загружается, но в консоли chrome я вижу, что загрузка был "отменен" и отображается красным цветом. Это часть более крупного мобильного веб-приложения, и тот факт, что оно отменяется, разрушает приложение, поскольку вызывает общий веб-сбой. Есть ли способ обойти это?
Саги Манн
27
Хороший фрагмент. Тем не менее, установка бессмысленного типа вещей немного беспокоит. Чтобы попросить браузер загрузить файл, который он может отобразить, используйте следующий заголовок: Content-Disposition: attachment; filename="downloaded.pdf"(конечно, вы можете настроить имя файла так, как вам нужно).
Риксо
2
Как заставить загрузку без сервера? Так что просто HTML-страница с небольшим количеством JavaScript.
Родриго Руис
222

2019 обновление современных браузеров

Такой подход я бы сейчас рекомендовал с несколькими оговорками:

  • Требуется относительно современный браузер
  • Если ожидается, что файл будет очень большим, вы, вероятно, должны сделать что-то похожее на оригинальный подход (iframe и cookie), потому что некоторые из приведенных ниже операций могут, вероятно, потреблять системную память, по крайней мере, такую ​​же, как загружаемый файл и / или другой интересный процессор побочные эффекты.

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(resp => resp.blob())
  .then(blob => {
    const url = window.URL.createObjectURL(blob);
    const a = document.createElement('a');
    a.style.display = 'none';
    a.href = url;
    // the filename you want
    a.download = 'todo-1.json';
    document.body.appendChild(a);
    a.click();
    window.URL.revokeObjectURL(url);
    alert('your file has downloaded!'); // or you know, something with better UX...
  })
  .catch(() => alert('oh no!'));

2012 оригинальный подход на основе jQuery / iframe / cookie

Я создал плагин jQuery File Download ( Demo ) ( GitHub ), который также может помочь в вашей ситуации. Он работает примерно так же с iframe, но имеет несколько интересных функций, которые я нашел довольно полезными:

  • Очень легко настроить с красивыми визуальными эффектами (JQuery UI Dialog, но не обязательно), все тоже протестировано

  • Пользователь никогда не покидает ту же страницу, с которой он инициировал загрузку файла. Эта функция становится критически важной для современных веб-приложений

  • Функции successCallback и failCallback позволяют вам четко указывать, что пользователь видит в любой ситуации

  • В сочетании с пользовательским интерфейсом jQuery разработчик может легко показать модальное сообщение, информирующее пользователя о том, что происходит загрузка файла, распустить модальное устройство после начала загрузки или даже дружески проинформировать пользователя о том, что произошла ошибка. Посмотрите Демо для примера этого. Надеюсь, это поможет кому-то!

Вот простая демонстрация варианта использования с использованием исходного кода плагина с обещаниями. Демонстрационная страница включает в себя множество других, «лучше» UX примеров.

$.fileDownload('some/file.pdf')
    .done(function () { alert('File download a success!'); })
    .fail(function () { alert('File download failed!'); });
Джон Кульвинер
источник
@JohnCulviner: могу ли я отправить данные JSON в ваш метод сообщения. Я попробовал это и потерпел неудачу. Можете ли вы дать мне образец
Сараванан
Можно ли передать параметры для вызова? скажем, мне нужно передать несколько идентификаторов, чтобы сервер сгенерировал файл, который я хочу загрузить, как я могу это сделать? спасибо
Омер Шлейфер
Сделали 100. Upvote. Спасибо за ваше время - это действительно ценно. Рассмотрите возможность размещения ссылки PayPal для пожертвований. Я бы пожертвовал.
Стефан Шинкель
Я попробовал это, но обратные вызовы никогда не выполняются. Плагин просто откроет ответ службы в новой вкладке, даже если служба вернула ошибку. Я не хочу, чтобы приложение открывало новую вкладку и отображало ответ службы при возникновении ошибки. Я даже добавил cookie, чтобы указать, что файл загружен истиной и ложью в случае успеха и неудачи, но ответ все равно открывается в новой вкладке ... любой способ исправить это ... Я использую метод get.
Вишал Гулати
1
@MarkAmery, который работает так же, как указали другие ответы. Такой подход (AFAIK) не дает обратной связи о том, когда начинается загрузка, когда она завершается и если это происходит с ошибкой, что удобно. Я мог бы добавить это к ответу для варианта «увольняйся и забывай». Также атрибут [download] не допускает POST или что-нибудь экзотическое.
Джон Калвинер
142
function downloadURI(uri, name) 
{
    var link = document.createElement("a");
    // If you don't know the name or want to use
    // the webserver default set name = ''
    link.setAttribute('download', name);
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    link.remove();
}

Проверьте, будут ли ваши целевые браузеры беспрепятственно запускать приведенный выше фрагмент кода:
http://caniuse.com/#feat=download

Представьте себе брейкер
источник
1
загрузка имени файла не изменилась ... протестировано в Chrome в апреле 2015 года
Novellizator
7
Для меня это было бы идеально, но это не работает и в Firefox. Есть идеи?
g07kore
2
Как упомянуто в caniuse.com/#feat=download , это работает только для ссылок того же происхождения в последних выпусках Firefox и Chrome. Так что, если ваши ссылки указывают на другой домен, он вряд ли где-то работает на данный момент.
Жан-Батист
9
Чтобы он работал в Firefox, сделайте document.body.appendChild(link)до и после щелчка, link.remove()чтобы избежать загрязнения DOM.
Okku
1
Вы также можете сделать так, link.download = ""чтобы оно сохраняло свое первоначальное имя файла и избегало его установки.
Окку
69

Я удивлен, что мало кто знает об атрибуте загрузки элементов. Пожалуйста, помогите распространить информацию об этом! Вы можете иметь скрытую ссылку html и подделать клик по ней. Если ссылка html имеет атрибут загрузки, она загружает файл, а не просматривает его, несмотря ни на что. Вот код Он загрузит изображение кота, если сможет его найти.

document.getElementById('download').click();
<a href="https://docs.google.com/uc?id=0B0jH18Lft7ypSmRjdWg1c082Y2M" download id="download" hidden></a>

Примечание. Это поддерживается не во всех браузерах: http://www.w3schools.com/tags/att_a_download.asp.

Полезно 13 лет
источник
12
Не поддерживается в IE и Safari
MatPag
9
Chrome загружается, но Firefox просто показывает картинку.
Саран
+1 за предоставление этого исполняемого фрагмента. Сэкономил мне время, чтобы проверить это, только чтобы узнать, что это не сработает.
Дупи
4
В последней версии Chrome (август 2018 года) тоже есть картинка (из-за абсурдного ограничения безопасности), поэтому ошибка
user1156544
Chrome не загружается для mp4s
Nearoo
53

Я рекомендую использовать в downloadатрибут для загрузки вместо JQuery:

<a href="your_link" download> file_name </a>

Это загрузит ваш файл, не открывая его.

Лаура Чесчес
источник
5
Он будет поддерживать только Chrome, Firefox, Opera и IE (> = 13,0)
Кунал Каккад
Edge> = 13, а не IE. Также реализации Edge 13 содержат ошибки, потому что имя файла игнорируется, и вместо этого вы получаете файл с идентификатором в качестве имени.
Дэвид
8
На мой взгляд, это правильный ответ на вопрос. Другие ответы имеют смысл, если вам нужно поддерживать старые браузеры и вам нужно обходное решение.
crabCRUSHERclamCOLLECTOR
19

Если вы уже используете jQuery, вы можете использовать его для создания меньшего фрагмента
. Версия ответа JQuery Эндрю:

var $idown;  // Keep it outside of the function, so it's initialized once.
downloadURL : function(url) {
  if ($idown) {
    $idown.attr('src',url);
  } else {
    $idown = $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
  }
},
//... How to use it:
downloadURL('http://whatever.com/file.pdf');
Corbacho
источник
К вашему сведению, кто-то предложил (через редактирование моего поста) добавить $ idown.attr ('src', url); после создания iframe в первый раз. Я не думаю, что это необходимо. Он уже устанавливает 'src: url' на этапе создания.
Корбахо
Также, чтобы прокомментировать, что в конце концов я не использовал это решение, потому что IE 9 не любил динамически создаваемые фреймы, указывающие на http: //, когда вы находитесь в сети https. Мне пришлось использовать «window.location.href», решение, которое тоже имеет некоторые неудобства
corbacho
часть "if ($ idown)" не работала для меня в последней версии Chrome (24), а просто создавала бесконечное число iframe. Может быть, потому что я хотел загрузить 12 вещей одновременно?
Нессур
6
ifЗаявление действительно должно быть:if( $idown && $idown.length > 0 )
iOnline247
3
Ничего не делает в Chrome
jjxtra
11

Работает на Chrome, Firefox и IE8 и выше.

var link=document.createElement('a');
document.body.appendChild(link);
link.href=url ;
link.click();
Эль Миссауи Хабиб
источник
Это также работает, если вы не добавляете ссылку на DOM.
Джони Карр
Если заголовки, возвращаемые с сервера, не указывают на иное, он будет просто перемещаться url, а не загружаться с него.
Марк Амери
10

Простой пример использования iframe

function downloadURL(url) {
    var hiddenIFrameID = 'hiddenDownloader',
        iframe = document.getElementById(hiddenIFrameID);
    if (iframe === null) {
        iframe = document.createElement('iframe');
        iframe.id = hiddenIFrameID;
        iframe.style.display = 'none';
        document.body.appendChild(iframe);
    }
    iframe.src = url;
};

Затем просто вызовите функцию, где вы хотите:

downloadURL('path/to/my/file');

Аарон Лелевье
источник
10

Это может быть полезно, если вам не требуется переходить на другую страницу. Это базовая функция javascript, поэтому ее можно использовать на любой платформе, где бэкэнд находится в Javascript.

window.location.assign('any url or file path')
Рохит Парте
источник
Это, вероятно, самое простое решение, если вы можете установить contentType самостоятельно. Я использую это как: window.location.href = downloadFileUrl;
BluE
Если администратор не хочет показывать URL пользователю, чем?
Нарен Верма
9

Спустя всего семь лет здесь появляется однострочное решение jQuery с использованием формы вместо фрейма или ссылки:

$('<form></form>')
     .attr('action', filePath)
     .appendTo('body').submit().remove();

Я проверил это в

  • Chrome 55
  • Firefox 50
  • Edge IE8-10
  • iOS 10 (Safari / Chrome)
  • Android Chrome

Если кто-нибудь знает какие-либо недостатки этого решения, я был бы очень рад услышать о них.


Полная демонстрация:

<html>
<head><script src="https://code.jquery.com/jquery-1.11.3.js"></script></head>
<body>
<script>
    var filePath = window.prompt("Enter a file URL","http://jqueryui.com/resources/download/jquery-ui-1.12.1.zip");
    $('<form></form>').attr('action', filePath).appendTo('body').submit().remove();
</script>
</body>
</html>
rakaloof
источник
7
Это не работает, если у вас filePathесть строка запроса, так как отправка формы перезапишет строку запроса в атрибуте действия.
Боборт
1
Я обошел это, добавив в форму входные данные: var authInput = $("<input>").attr("type", "hidden").attr("name", "myQsKey").val('MyQsValue'); $('<form></form>') .attr('action', filePath) .append($(authInput)) .appendTo('body').submit().remove();Это эквивалентно доступу:filepath?myQsKey=myValue
Харальд Хервик,
Это также закрывает веб-сокеты.
radu122
2
Это выглядит как очень сложный путь к набору window.locationв filePath. Просто window.location = filePath;сделал бы то же самое.
Иво Смитс
Независимо от того, есть ли у этого решения недостатки , по сути, вы не предоставили никаких преимуществ использования этого по ссылке. (И есть недостаток: вы не можете использовать downloadатрибут таким образом, чтобы сообщить браузеру, что вы хотите загрузить, независимо от того, какие заголовки возвращает сервер, что вы можете сделать с aэлементом.)
Марк Амери
5

Я не знаю, является ли вопрос слишком старым, но установка window.location в URL для загрузки будет работать, если тип mime для загрузки правильный (например, zip-архив).

var download = function(downloadURL) {

   location = downloadURL;

});

download('http://example.com/archive.zip'); //correct usage
download('http://example.com/page.html'); //DON'T
Мацей Кравчик
источник
5

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

let data = JSON.stringify([{email: "test@domain.com", name: "test"}, {email: "anothertest@example.com", name: "anothertest"}]);

let type = "application/json", name = "testfile.json";
downloader(data, type, name)

function downloader(data, type, name) {
	let blob = new Blob([data], {type});
	let url = window.URL.createObjectURL(blob);
	downloadURI(url, name);
	window.URL.revokeObjectURL(url);
}

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

Обновить

function downloadURI(uri, name) {
    let link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.click();
}

function downloader(data, type, name) {
    let blob = new Blob([data], {type});
    let url = window.URL.createObjectURL(blob);
    downloadURI(url, name);
    window.URL.revokeObjectURL(url);
}
АБК
источник
Какой смысл использовать MouseEventздесь вместо того, чтобы всегда использовать click? А зачем добавлять ссылку на документ перед тем, как щелкнуть по нему? Может быть, это имеет преимущества перед более простым подходом, показанным на stackoverflow.com/a/23013574/1709587 , но если это так, то здесь они не объясняются.
Марк Амери
Я давно отправил этот ответ. Я не могу вспомнить, есть ли какая-то причина за этими ненужными строками кода.
Абк
3

Чтобы улучшить ответ Imagine Breaker, это поддерживается в FF & IE:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);

function downloadURI(uri, name) {
    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    link.dispatchEvent(evt);
}

Другими словами, просто используйте dispatchEventфункцию вместо click();

La masse
источник
Как это улучшение? Кажется, это просто более сложный способ сделать то же самое.
Марк Амери
3

Может быть, просто попросите ваш javascript открыть страницу, которая просто загружает файл, например, когда вы перетаскиваете ссылку на скачивание на новую вкладку:

Window.open("https://www.MyServer.
Org/downloads/ardiuno/WgiWho=?:8080")

При открытом окне откройте страницу загрузки, которая автоматически закрывается.

Брайан Вальс
источник
1
Это создает всплывающее окно, которое блокируется большинством браузеров
Ashton Wiersdorf
3

Ниже приведен наиболее полный и работающий (протестированный) код для загрузки данных для FireFox, Chrome и IE. Предположим, что Data находится в поле texarea , которое имеет id = 'textarea_area', а имя файла - это имя файла, в который будут загружаться данные.

function download(filename) {
    if (typeof filename==='undefined') filename = ""; // default
    value = document.getElementById('textarea_area').value;

    filetype="text/*";
    extension=filename.substring(filename.lastIndexOf("."));
    for (var i = 0; i < extToMIME.length; i++) {
        if (extToMIME[i][0].localeCompare(extension)==0) {
            filetype=extToMIME[i][1];
            break;
        }
    }


    var pom = document.createElement('a');
    pom.setAttribute('href', 'data: '+filetype+';charset=utf-8,' + '\ufeff' + encodeURIComponent(value)); // Added BOM too
    pom.setAttribute('download', filename);


    if (document.createEvent) {
        if (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > 0) { // IE
            blobObject = new Blob(['\ufeff'+value]);
            window.navigator.msSaveBlob(blobObject, filename);
        } else { // FF, Chrome
            var event = document.createEvent('MouseEvents');
            event.initEvent('click', true, true);
            pom.dispatchEvent(event);
        }
    } else if( document.createEventObject ) { // Have No Idea
        var evObj = document.createEventObject();
        pom.fireEvent( 'onclick' , evObj );
    } else { // For Any Case
        pom.click();
    }

}

а потом просто позвони

<a href="javascript:download();">Download</a>

Для начала загрузки.

Массив для установки правильного типа MIME для диалога загрузки МОЖЕТ быть следующим:

// ----------------------- Extensions to MIME --------- //

        // List of mime types
        // combination of values from Windows 7 Registry and 
        // from C:\Windows\System32\inetsrv\config\applicationHost.config
        // some added, including .7z and .dat
    var extToMIME = [
        [".323", "text/h323"],
        [".3g2", "video/3gpp2"],
        [".3gp", "video/3gpp"],
        [".3gp2", "video/3gpp2"],
        [".3gpp", "video/3gpp"],
        [".7z", "application/x-7z-compressed"],
        [".aa", "audio/audible"],
        [".AAC", "audio/aac"],
        [".aaf", "application/octet-stream"],
        [".aax", "audio/vnd.audible.aax"],
        [".ac3", "audio/ac3"],
        [".aca", "application/octet-stream"],
        [".accda", "application/msaccess.addin"],
        [".accdb", "application/msaccess"],
        [".accdc", "application/msaccess.cab"],
        [".accde", "application/msaccess"],
        [".accdr", "application/msaccess.runtime"],
        [".accdt", "application/msaccess"],
        [".accdw", "application/msaccess.webapplication"],
        [".accft", "application/msaccess.ftemplate"],
        [".acx", "application/internet-property-stream"],
        [".AddIn", "text/xml"],
        [".ade", "application/msaccess"],
        [".adobebridge", "application/x-bridge-url"],
        [".adp", "application/msaccess"],
        [".ADT", "audio/vnd.dlna.adts"],
        [".ADTS", "audio/aac"],
        [".afm", "application/octet-stream"],
        [".ai", "application/postscript"],
        [".aif", "audio/x-aiff"],
        [".aifc", "audio/aiff"],
        [".aiff", "audio/aiff"],
        [".air", "application/vnd.adobe.air-application-installer-package+zip"],
        [".amc", "application/x-mpeg"],
        [".application", "application/x-ms-application"],
        [".art", "image/x-jg"],
        [".asa", "application/xml"],
        [".asax", "application/xml"],
        [".ascx", "application/xml"],
        [".asd", "application/octet-stream"],
        [".asf", "video/x-ms-asf"],
        [".ashx", "application/xml"],
        [".asi", "application/octet-stream"],
        [".asm", "text/plain"],
        [".asmx", "application/xml"],
        [".aspx", "application/xml"],
        [".asr", "video/x-ms-asf"],
        [".asx", "video/x-ms-asf"],
        [".atom", "application/atom+xml"],
        [".au", "audio/basic"],
        [".avi", "video/x-msvideo"],
        [".axs", "application/olescript"],
        [".bas", "text/plain"],
        [".bcpio", "application/x-bcpio"],
        [".bin", "application/octet-stream"],
        [".bmp", "image/bmp"],
        [".c", "text/plain"],
        [".cab", "application/octet-stream"],
        [".caf", "audio/x-caf"],
        [".calx", "application/vnd.ms-office.calx"],
        [".cat", "application/vnd.ms-pki.seccat"],
        [".cc", "text/plain"],
        [".cd", "text/plain"],
        [".cdda", "audio/aiff"],
        [".cdf", "application/x-cdf"],
        [".cer", "application/x-x509-ca-cert"],
        [".chm", "application/octet-stream"],
        [".class", "application/x-java-applet"],
        [".clp", "application/x-msclip"],
        [".cmx", "image/x-cmx"],
        [".cnf", "text/plain"],
        [".cod", "image/cis-cod"],
        [".config", "application/xml"],
        [".contact", "text/x-ms-contact"],
        [".coverage", "application/xml"],
        [".cpio", "application/x-cpio"],
        [".cpp", "text/plain"],
        [".crd", "application/x-mscardfile"],
        [".crl", "application/pkix-crl"],
        [".crt", "application/x-x509-ca-cert"],
        [".cs", "text/plain"],
        [".csdproj", "text/plain"],
        [".csh", "application/x-csh"],
        [".csproj", "text/plain"],
        [".css", "text/css"],
        [".csv", "text/csv"],
        [".cur", "application/octet-stream"],
        [".cxx", "text/plain"],
        [".dat", "application/octet-stream"],
        [".datasource", "application/xml"],
        [".dbproj", "text/plain"],
        [".dcr", "application/x-director"],
        [".def", "text/plain"],
        [".deploy", "application/octet-stream"],
        [".der", "application/x-x509-ca-cert"],
        [".dgml", "application/xml"],
        [".dib", "image/bmp"],
        [".dif", "video/x-dv"],
        [".dir", "application/x-director"],
        [".disco", "text/xml"],
        [".dll", "application/x-msdownload"],
        [".dll.config", "text/xml"],
        [".dlm", "text/dlm"],
        [".doc", "application/msword"],
        [".docm", "application/vnd.ms-word.document.macroEnabled.12"],
        [".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
        [".dot", "application/msword"],
        [".dotm", "application/vnd.ms-word.template.macroEnabled.12"],
        [".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"],
        [".dsp", "application/octet-stream"],
        [".dsw", "text/plain"],
        [".dtd", "text/xml"],
        [".dtsConfig", "text/xml"],
        [".dv", "video/x-dv"],
        [".dvi", "application/x-dvi"],
        [".dwf", "drawing/x-dwf"],
        [".dwp", "application/octet-stream"],
        [".dxr", "application/x-director"],
        [".eml", "message/rfc822"],
        [".emz", "application/octet-stream"],
        [".eot", "application/octet-stream"],
        [".eps", "application/postscript"],
        [".etl", "application/etl"],
        [".etx", "text/x-setext"],
        [".evy", "application/envoy"],
        [".exe", "application/octet-stream"],
        [".exe.config", "text/xml"],
        [".fdf", "application/vnd.fdf"],
        [".fif", "application/fractals"],
        [".filters", "Application/xml"],
        [".fla", "application/octet-stream"],
        [".flr", "x-world/x-vrml"],
        [".flv", "video/x-flv"],
        [".fsscript", "application/fsharp-script"],
        [".fsx", "application/fsharp-script"],
        [".generictest", "application/xml"],
        [".gif", "image/gif"],
        [".group", "text/x-ms-group"],
        [".gsm", "audio/x-gsm"],
        [".gtar", "application/x-gtar"],
        [".gz", "application/x-gzip"],
        [".h", "text/plain"],
        [".hdf", "application/x-hdf"],
        [".hdml", "text/x-hdml"],
        [".hhc", "application/x-oleobject"],
        [".hhk", "application/octet-stream"],
        [".hhp", "application/octet-stream"],
        [".hlp", "application/winhlp"],
        [".hpp", "text/plain"],
        [".hqx", "application/mac-binhex40"],
        [".hta", "application/hta"],
        [".htc", "text/x-component"],
        [".htm", "text/html"],
        [".html", "text/html"],
        [".htt", "text/webviewhtml"],
        [".hxa", "application/xml"],
        [".hxc", "application/xml"],
        [".hxd", "application/octet-stream"],
        [".hxe", "application/xml"],
        [".hxf", "application/xml"],
        [".hxh", "application/octet-stream"],
        [".hxi", "application/octet-stream"],
        [".hxk", "application/xml"],
        [".hxq", "application/octet-stream"],
        [".hxr", "application/octet-stream"],
        [".hxs", "application/octet-stream"],
        [".hxt", "text/html"],
        [".hxv", "application/xml"],
        [".hxw", "application/octet-stream"],
        [".hxx", "text/plain"],
        [".i", "text/plain"],
        [".ico", "image/x-icon"],
        [".ics", "application/octet-stream"],
        [".idl", "text/plain"],
        [".ief", "image/ief"],
        [".iii", "application/x-iphone"],
        [".inc", "text/plain"],
        [".inf", "application/octet-stream"],
        [".inl", "text/plain"],
        [".ins", "application/x-internet-signup"],
        [".ipa", "application/x-itunes-ipa"],
        [".ipg", "application/x-itunes-ipg"],
        [".ipproj", "text/plain"],
        [".ipsw", "application/x-itunes-ipsw"],
        [".iqy", "text/x-ms-iqy"],
        [".isp", "application/x-internet-signup"],
        [".ite", "application/x-itunes-ite"],
        [".itlp", "application/x-itunes-itlp"],
        [".itms", "application/x-itunes-itms"],
        [".itpc", "application/x-itunes-itpc"],
        [".IVF", "video/x-ivf"],
        [".jar", "application/java-archive"],
        [".java", "application/octet-stream"],
        [".jck", "application/liquidmotion"],
        [".jcz", "application/liquidmotion"],
        [".jfif", "image/pjpeg"],
        [".jnlp", "application/x-java-jnlp-file"],
        [".jpb", "application/octet-stream"],
        [".jpe", "image/jpeg"],
        [".jpeg", "image/jpeg"],
        [".jpg", "image/jpeg"],
        [".js", "application/x-javascript"],
        [".json", "application/json"],
        [".jsx", "text/jscript"],
        [".jsxbin", "text/plain"],
        [".latex", "application/x-latex"],
        [".library-ms", "application/windows-library+xml"],
        [".lit", "application/x-ms-reader"],
        [".loadtest", "application/xml"],
        [".lpk", "application/octet-stream"],
        [".lsf", "video/x-la-asf"],
        [".lst", "text/plain"],
        [".lsx", "video/x-la-asf"],
        [".lzh", "application/octet-stream"],
        [".m13", "application/x-msmediaview"],
        [".m14", "application/x-msmediaview"],
        [".m1v", "video/mpeg"],
        [".m2t", "video/vnd.dlna.mpeg-tts"],
        [".m2ts", "video/vnd.dlna.mpeg-tts"],
        [".m2v", "video/mpeg"],
        [".m3u", "audio/x-mpegurl"],
        [".m3u8", "audio/x-mpegurl"],
        [".m4a", "audio/m4a"],
        [".m4b", "audio/m4b"],
        [".m4p", "audio/m4p"],
        [".m4r", "audio/x-m4r"],
        [".m4v", "video/x-m4v"],
        [".mac", "image/x-macpaint"],
        [".mak", "text/plain"],
        [".man", "application/x-troff-man"],
        [".manifest", "application/x-ms-manifest"],
        [".map", "text/plain"],
        [".master", "application/xml"],
        [".mda", "application/msaccess"],
        [".mdb", "application/x-msaccess"],
        [".mde", "application/msaccess"],
        [".mdp", "application/octet-stream"],
        [".me", "application/x-troff-me"],
        [".mfp", "application/x-shockwave-flash"],
        [".mht", "message/rfc822"],
        [".mhtml", "message/rfc822"],
        [".mid", "audio/mid"],
        [".midi", "audio/mid"],
        [".mix", "application/octet-stream"],
        [".mk", "text/plain"],
        [".mmf", "application/x-smaf"],
        [".mno", "text/xml"],
        [".mny", "application/x-msmoney"],
        [".mod", "video/mpeg"],
        [".mov", "video/quicktime"],
        [".movie", "video/x-sgi-movie"],
        [".mp2", "video/mpeg"],
        [".mp2v", "video/mpeg"],
        [".mp3", "audio/mpeg"],
        [".mp4", "video/mp4"],
        [".mp4v", "video/mp4"],
        [".mpa", "video/mpeg"],
        [".mpe", "video/mpeg"],
        [".mpeg", "video/mpeg"],
        [".mpf", "application/vnd.ms-mediapackage"],
        [".mpg", "video/mpeg"],
        [".mpp", "application/vnd.ms-project"],
        [".mpv2", "video/mpeg"],
        [".mqv", "video/quicktime"],
        [".ms", "application/x-troff-ms"],
        [".msi", "application/octet-stream"],
        [".mso", "application/octet-stream"],
        [".mts", "video/vnd.dlna.mpeg-tts"],
        [".mtx", "application/xml"],
        [".mvb", "application/x-msmediaview"],
        [".mvc", "application/x-miva-compiled"],
        [".mxp", "application/x-mmxp"],
        [".nc", "application/x-netcdf"],
        [".nsc", "video/x-ms-asf"],
        [".nws", "message/rfc822"],
        [".ocx", "application/octet-stream"],
        [".oda", "application/oda"],
        [".odc", "text/x-ms-odc"],
        [".odh", "text/plain"],
        [".odl", "text/plain"],
        [".odp", "application/vnd.oasis.opendocument.presentation"],
        [".ods", "application/oleobject"],
        [".odt", "application/vnd.oasis.opendocument.text"],
        [".one", "application/onenote"],
        [".onea", "application/onenote"],
        [".onepkg", "application/onenote"],
        [".onetmp", "application/onenote"],
        [".onetoc", "application/onenote"],
        [".onetoc2", "application/onenote"],
        [".orderedtest", "application/xml"],
        [".osdx", "application/opensearchdescription+xml"],
        [".p10", "application/pkcs10"],
        [".p12", "application/x-pkcs12"],
        [".p7b", "application/x-pkcs7-certificates"],
        [".p7c", "application/pkcs7-mime"],
        [".p7m", "application/pkcs7-mime"],
        [".p7r", "application/x-pkcs7-certreqresp"],
        [".p7s", "application/pkcs7-signature"],
        [".pbm", "image/x-portable-bitmap"],
        [".pcast", "application/x-podcast"],
        [".pct", "image/pict"],
        [".pcx", "application/octet-stream"],
        [".pcz", "application/octet-stream"],
        [".pdf", "application/pdf"],
        [".pfb", "application/octet-stream"],
        [".pfm", "application/octet-stream"],
        [".pfx", "application/x-pkcs12"],
        [".pgm", "image/x-portable-graymap"],
        [".pic", "image/pict"],
        [".pict", "image/pict"],
        [".pkgdef", "text/plain"],
        [".pkgundef", "text/plain"],
        [".pko", "application/vnd.ms-pki.pko"],
        [".pls", "audio/scpls"],
        [".pma", "application/x-perfmon"],
        [".pmc", "application/x-perfmon"],
        [".pml", "application/x-perfmon"],
        [".pmr", "application/x-perfmon"],
        [".pmw", "application/x-perfmon"],
        [".png", "image/png"],
        [".pnm", "image/x-portable-anymap"],
        [".pnt", "image/x-macpaint"],
        [".pntg", "image/x-macpaint"],
        [".pnz", "image/png"],
        [".pot", "application/vnd.ms-powerpoint"],
        [".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"],
        [".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"],
        [".ppa", "application/vnd.ms-powerpoint"],
        [".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"],
        [".ppm", "image/x-portable-pixmap"],
        [".pps", "application/vnd.ms-powerpoint"],
        [".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"],
        [".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"],
        [".ppt", "application/vnd.ms-powerpoint"],
        [".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"],
        [".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"],
        [".prf", "application/pics-rules"],
        [".prm", "application/octet-stream"],
        [".prx", "application/octet-stream"],
        [".ps", "application/postscript"],
        [".psc1", "application/PowerShell"],
        [".psd", "application/octet-stream"],
        [".psess", "application/xml"],
        [".psm", "application/octet-stream"],
        [".psp", "application/octet-stream"],
        [".pub", "application/x-mspublisher"],
        [".pwz", "application/vnd.ms-powerpoint"],
        [".qht", "text/x-html-insertion"],
        [".qhtm", "text/x-html-insertion"],
        [".qt", "video/quicktime"],
        [".qti", "image/x-quicktime"],
        [".qtif", "image/x-quicktime"],
        [".qtl", "application/x-quicktimeplayer"],
        [".qxd", "application/octet-stream"],
        [".ra", "audio/x-pn-realaudio"],
        [".ram", "audio/x-pn-realaudio"],
        [".rar", "application/octet-stream"],
        [".ras", "image/x-cmu-raster"],
        [".rat", "application/rat-file"],
        [".rc", "text/plain"],
        [".rc2", "text/plain"],
        [".rct", "text/plain"],
        [".rdlc", "application/xml"],
        [".resx", "application/xml"],
        [".rf", "image/vnd.rn-realflash"],
        [".rgb", "image/x-rgb"],
        [".rgs", "text/plain"],
        [".rm", "application/vnd.rn-realmedia"],
        [".rmi", "audio/mid"],
        [".rmp", "application/vnd.rn-rn_music_package"],
        [".roff", "application/x-troff"],
        [".rpm", "audio/x-pn-realaudio-plugin"],
        [".rqy", "text/x-ms-rqy"],
        [".rtf", "application/rtf"],
        [".rtx", "text/richtext"],
        [".ruleset", "application/xml"],
        [".s", "text/plain"],
        [".safariextz", "application/x-safari-safariextz"],
        [".scd", "application/x-msschedule"],
        [".sct", "text/scriptlet"],
        [".sd2", "audio/x-sd2"],
        [".sdp", "application/sdp"],
        [".sea", "application/octet-stream"],
        [".searchConnector-ms", "application/windows-search-connector+xml"],
        [".setpay", "application/set-payment-initiation"],
        [".setreg", "application/set-registration-initiation"],
        [".settings", "application/xml"],
        [".sgimb", "application/x-sgimb"],
        [".sgml", "text/sgml"],
        [".sh", "application/x-sh"],
        [".shar", "application/x-shar"],
        [".shtml", "text/html"],
        [".sit", "application/x-stuffit"],
        [".sitemap", "application/xml"],
        [".skin", "application/xml"],
        [".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"],
        [".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"],
        [".slk", "application/vnd.ms-excel"],
        [".sln", "text/plain"],
        [".slupkg-ms", "application/x-ms-license"],
        [".smd", "audio/x-smd"],
        [".smi", "application/octet-stream"],
        [".smx", "audio/x-smd"],
        [".smz", "audio/x-smd"],
        [".snd", "audio/basic"],
        [".snippet", "application/xml"],
        [".snp", "application/octet-stream"],
        [".sol", "text/plain"],
        [".sor", "text/plain"],
        [".spc", "application/x-pkcs7-certificates"],
        [".spl", "application/futuresplash"],
        [".src", "application/x-wais-source"],
        [".srf", "text/plain"],
        [".SSISDeploymentManifest", "text/xml"],
        [".ssm", "application/streamingmedia"],
        [".sst", "application/vnd.ms-pki.certstore"],
        [".stl", "application/vnd.ms-pki.stl"],
        [".sv4cpio", "application/x-sv4cpio"],
        [".sv4crc", "application/x-sv4crc"],
        [".svc", "application/xml"],
        [".swf", "application/x-shockwave-flash"],
        [".t", "application/x-troff"],
        [".tar", "application/x-tar"],
        [".tcl", "application/x-tcl"],
        [".testrunconfig", "application/xml"],
        [".testsettings", "application/xml"],
        [".tex", "application/x-tex"],
        [".texi", "application/x-texinfo"],
        [".texinfo", "application/x-texinfo"],
        [".tgz", "application/x-compressed"],
        [".thmx", "application/vnd.ms-officetheme"],
        [".thn", "application/octet-stream"],
        [".tif", "image/tiff"],
        [".tiff", "image/tiff"],
        [".tlh", "text/plain"],
        [".tli", "text/plain"],
        [".toc", "application/octet-stream"],
        [".tr", "application/x-troff"],
        [".trm", "application/x-msterminal"],
        [".trx", "application/xml"],
        [".ts", "video/vnd.dlna.mpeg-tts"],
        [".tsv", "text/tab-separated-values"],
        [".ttf", "application/octet-stream"],
        [".tts", "video/vnd.dlna.mpeg-tts"],
        [".txt", "text/plain"],
        [".u32", "application/octet-stream"],
        [".uls", "text/iuls"],
        [".user", "text/plain"],
        [".ustar", "application/x-ustar"],
        [".vb", "text/plain"],
        [".vbdproj", "text/plain"],
        [".vbk", "video/mpeg"],
        [".vbproj", "text/plain"],
        [".vbs", "text/vbscript"],
        [".vcf", "text/x-vcard"],
        [".vcproj", "Application/xml"],
        [".vcs", "text/plain"],
        [".vcxproj", "Application/xml"],
        [".vddproj", "text/plain"],
        [".vdp", "text/plain"],
        [".vdproj", "text/plain"],
        [".vdx", "application/vnd.ms-visio.viewer"],
        [".vml", "text/xml"],
        [".vscontent", "application/xml"],
        [".vsct", "text/xml"],
        [".vsd", "application/vnd.visio"],
        [".vsi", "application/ms-vsi"],
        [".vsix", "application/vsix"],
        [".vsixlangpack", "text/xml"],
        [".vsixmanifest", "text/xml"],
        [".vsmdi", "application/xml"],
        [".vspscc", "text/plain"],
        [".vss", "application/vnd.visio"],
        [".vsscc", "text/plain"],
        [".vssettings", "text/xml"],
        [".vssscc", "text/plain"],
        [".vst", "application/vnd.visio"],
        [".vstemplate", "text/xml"],
        [".vsto", "application/x-ms-vsto"],
        [".vsw", "application/vnd.visio"],
        [".vsx", "application/vnd.visio"],
        [".vtx", "application/vnd.visio"],
        [".wav", "audio/wav"],
        [".wave", "audio/wav"],
        [".wax", "audio/x-ms-wax"],
        [".wbk", "application/msword"],
        [".wbmp", "image/vnd.wap.wbmp"],
        [".wcm", "application/vnd.ms-works"],
        [".wdb", "application/vnd.ms-works"],
        [".wdp", "image/vnd.ms-photo"],
        [".webarchive", "application/x-safari-webarchive"],
        [".webtest", "application/xml"],
        [".wiq", "application/xml"],
        [".wiz", "application/msword"],
        [".wks", "application/vnd.ms-works"],
        [".WLMP", "application/wlmoviemaker"],
        [".wlpginstall", "application/x-wlpg-detect"],
        [".wlpginstall3", "application/x-wlpg3-detect"],
        [".wm", "video/x-ms-wm"],
        [".wma", "audio/x-ms-wma"],
        [".wmd", "application/x-ms-wmd"],
        [".wmf", "application/x-msmetafile"],
        [".wml", "text/vnd.wap.wml"],
        [".wmlc", "application/vnd.wap.wmlc"],
        [".wmls", "text/vnd.wap.wmlscript"],
        [".wmlsc", "application/vnd.wap.wmlscriptc"],
        [".wmp", "video/x-ms-wmp"],
        [".wmv", "video/x-ms-wmv"],
        [".wmx", "video/x-ms-wmx"],
        [".wmz", "application/x-ms-wmz"],
        [".wpl", "application/vnd.ms-wpl"],
        [".wps", "application/vnd.ms-works"],
        [".wri", "application/x-mswrite"],
        [".wrl", "x-world/x-vrml"],
        [".wrz", "x-world/x-vrml"],
        [".wsc", "text/scriptlet"],
        [".wsdl", "text/xml"],
        [".wvx", "video/x-ms-wvx"],
        [".x", "application/directx"],
        [".xaf", "x-world/x-vrml"],
        [".xaml", "application/xaml+xml"],
        [".xap", "application/x-silverlight-app"],
        [".xbap", "application/x-ms-xbap"],
        [".xbm", "image/x-xbitmap"],
        [".xdr", "text/plain"],
        [".xht", "application/xhtml+xml"],
        [".xhtml", "application/xhtml+xml"],
        [".xla", "application/vnd.ms-excel"],
        [".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"],
        [".xlc", "application/vnd.ms-excel"],
        [".xld", "application/vnd.ms-excel"],
        [".xlk", "application/vnd.ms-excel"],
        [".xll", "application/vnd.ms-excel"],
        [".xlm", "application/vnd.ms-excel"],
        [".xls", "application/vnd.ms-excel"],
        [".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"],
        [".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"],
        [".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
        [".xlt", "application/vnd.ms-excel"],
        [".xltm", "application/vnd.ms-excel.template.macroEnabled.12"],
        [".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"],
        [".xlw", "application/vnd.ms-excel"],
        [".xml", "text/xml"],
        [".xmta", "application/xml"],
        [".xof", "x-world/x-vrml"],
        [".XOML", "text/plain"],
        [".xpm", "image/x-xpixmap"],
        [".xps", "application/vnd.ms-xpsdocument"],
        [".xrm-ms", "text/xml"],
        [".xsc", "application/xml"],
        [".xsd", "text/xml"],
        [".xsf", "text/xml"],
        [".xsl", "text/xml"],
        [".xslt", "text/xml"],
        [".xsn", "application/octet-stream"],
        [".xss", "application/xml"],
        [".xtp", "application/octet-stream"],
        [".xwd", "image/x-xwindowdump"],
        [".z", "application/x-compress"],
        [".zip", "application/x-zip-compressed"]
];

// ----------------------- End of Extensions to MIME --------- //
Урмас Репинский
источник
- Я пытался это с PDF-файлами. Файл загружается, но всегда поврежден. Какие-либо предложения? Спасибо
Шриват Кулкарни
2

у меня это работает нормально проверено в chrome v72

function down_file(url,name){
var a = $("<a>")
    .attr("href", url)
    .attr("download", name)
    .appendTo("body");
a[0].click();
a.remove();
}

down_file('https://www.useotools.com/uploads/nulogo[1].png','logo.png')
user889030
источник
Это тот же самый подход, который был показан в ответе Imagine Breaker годами ранее, но с дополнительным недостатком в требовании jQuery.
Марк Амери
1

У меня были хорошие результаты с использованием тега FORM, так как он работает везде, и вам не нужно временно создавать файлы на сервере. Метод работает следующим образом.

На стороне клиента (страница HTML) вы создаете невидимую форму, подобную этой

<form method="POST" action="/download.php" target="_blank" id="downloadForm">
    <input type="hidden" name="data" id="csv">
</form>

Затем вы добавляете этот код Javascript к вашей кнопке:

$('#button').click(function() {
     $('#csv').val('---your data---');
     $('#downloadForm').submit();
}

На стороне сервера у вас есть следующий PHP-код download.php:

<?php
header('Content-Type: text/csv');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=out.csv');
header('Content-Transfer-Encoding: binary');
header('Connection: Keep-Alive');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($data));

echo $_REQUEST['data'];
exit();

Вы даже можете создавать zip-файлы с вашими данными следующим образом:

<?php

$file = tempnam("tmp", "zip");

$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);
$zip->addFromString('test.csv', $_REQUEST['data']);
$zip->close();

header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
unlink($file); 

Самое приятное, что он не оставляет на вашем сервере никаких остаточных файлов, поскольку все создается и уничтожается на лету!

supersan
источник
0

Ответ, представленный hitesh 30 декабря 13 года, фактически работает. Это просто требует небольшой корректировки:

Файл PHP может вызывать сам себя. Другими словами, просто создайте файл с именем saveAs.php и вставьте в него этот код ...

        <a href="saveAs.php?file_source=YourDataFile.pdf">Download pdf here</a>

    <?php
        if (isset($_GET['file_source'])) {
            $fullPath = $_GET['file_source'];
            if($fullPath) {
                $fsize = filesize($fullPath);
                $path_parts = pathinfo($fullPath);
                $ext = strtolower($path_parts["extension"]);
                switch ($ext) {
                    case "pdf":
                    header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
                    header("Content-type: application/pdf"); // add here more headers for diff. extensions
                    break;
                    default;
                    header("Content-type: application/octet-stream");
                    header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
                }
                if($fsize) {//checking if file size exist
                  header("Content-length: $fsize");
                }
                readfile($fullPath);
                exit;
            }
        }
    ?>
amger
источник
0

Эти функции используются в stacktrace.js :

/**
 * Try XHR methods in order and store XHR factory.
 *
 * @return <Function> XHR function or equivalent
 */
var createXMLHTTPObject = function() {
    var xmlhttp, XMLHttpFactories = [
        function() {
            return new XMLHttpRequest();
        }, function() {
            return new ActiveXObject('Msxml2.XMLHTTP');
        }, function() {
            return new ActiveXObject('Msxml3.XMLHTTP');
        }, function() {
            return new ActiveXObject('Microsoft.XMLHTTP');
        }
    ];
    for (var i = 0; i < XMLHttpFactories.length; i++) {
        try {
            xmlhttp = XMLHttpFactories[i]();
            // Use memoization to cache the factory
            createXMLHTTPObject = XMLHttpFactories[i];
            return xmlhttp;
        } catch (e) {
        }
    }
}

/**
 * @return the text from a given URL
 */
function ajax(url) {
    var req = createXMLHTTPObject();
    if (req) {
        try {
            req.open('GET', url, false);
            req.send(null);
            return req.responseText;
        } catch (e) {
        }
    }
    return '';
}
BT
источник
Это ... кажется, только для XHR, а не для загрузки файлов? Я не вижу здесь уместности.
Марк Амери
0

Я предлагаю вам использовать событие mousedown, которое называется ДО события click. Таким образом, браузер обрабатывает событие click естественным образом, что позволяет избежать любой странности кода:

(function ($) {


    // with this solution, the browser handles the download link naturally (tested in chrome and firefox)
    $(document).ready(function () {

        var url = '/private/downloads/myfile123.pdf';
        $("a#someID").on('mousedown', function () {
            $(this).attr("href", url);
        });

    });
})(jQuery);
вереск
источник
0

Отличное решение от Corbacho, я просто приспособился, чтобы избавиться от вар

function downloadURL(url) {
    if( $('#idown').length ){
        $('#idown').attr('src',url);
    }else{
        $('<iframe>', { id:'idown', src:url }).hide().appendTo('body');
    }
}
ebelendez
источник
0

Firefox и Chrome протестированы:

var link = document.createElement('a');
link.download = 'fileName.ext'
link.href = 'http://down.serv/file.ext';

// Because firefox not executing the .click() well
// We need to create mouse event initialization.
var clickEvent = document.createEvent("MouseEvent");
clickEvent.initEvent("click", true, true);

link.dispatchEvent(clickEvent);

На самом деле это «хромовое» решение для Firefox (я не тестировал его в других браузерах, поэтому, пожалуйста, оставляйте комментарии о скомпилируемости)

Ifch0o1
источник
0

При загрузке файла может случиться так много мелочей. Несоответствие между одними браузерами - это кошмар. В итоге я использовал эту замечательную маленькую библиотеку. https://github.com/rndme/download

Приятно то, что он гибок не только для URL, но и для данных на стороне клиента, которые вы хотите загрузить.

  1. текстовая строка
  2. текстовые данныеURL
  3. текстовый блоб
  4. текстовые массивы
  5. HTML-строка
  6. HTML-капля
  7. Ajax Callback
  8. бинарные файлы
Донни В.
источник
-1

С помощью тега привязки и PHP это можно сделать. Проверьте этот ответ

JQuery Ajax для загрузки файла PDF

HTML
    <a href="www.example.com/download_file.php?file_source=example.pdf">Download pdf here</a>

PHP
<?php
$fullPath = $_GET['fileSource'];
if($fullPath) {
    $fsize = filesize($fullPath);
    $path_parts = pathinfo($fullPath);
    $ext = strtolower($path_parts["extension"]);
    switch ($ext) {
        case "pdf":
        header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
        header("Content-type: application/pdf"); // add here more headers for diff. extensions
        break;
        default;
        header("Content-type: application/octet-stream");
        header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
    }
    if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }
    readfile($fullPath);
    exit;
}
?>

Я проверяю размер файла, потому что если вы загружаете pdf из облачного фронта CDN, вы не получите размер документа, который заставляет документ загружаться в 0 КБ. Чтобы избежать этого, я проверяю это условие

 if($fsize) {//checking if file size exist
      header("Content-length: $fsize");
    }
Hitesh
источник
-1

Я знаю, что опаздываю на вечеринку, но я хотел бы поделиться своим решением, которое является вариантом решения Imagine Breaker выше. Я пытался использовать его решение, потому что его решение кажется мне наиболее простым и легким. Но, как говорили другие, он не работал для некоторых браузеров, поэтому я добавил некоторые изменения с помощью jquery.

Надеюсь, что это может помочь кому-то там.

function download(url) {
  var link = document.createElement("a");
  $(link).click(function(e) {
    e.preventDefault();
    window.location.href = url;
  });
  $(link).click();
}
genki98
источник
Все это тело функции - просто слишком сложный способ выполнения window.location.href = url. Ссылка, которую вы создаете, ни для чего не используется.
Марк Амери
-1

Примечание. Поддерживается не во всех браузерах.

Я искал способ загрузить файл с помощью jquery, не устанавливая URL-адрес файла в атрибуте href с самого начала.

jQuery('<a/>', {
    id: 'downloadFile',
    href: 'http://cdn.sstatic.net/Sites/stackoverflow/img/apple-touch-icon@2.png',
    style: 'display:hidden;',
    download: ''
}).appendTo('body');

$("#downloadFile")[0].click();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Ксеро Каэль
источник
-1

Я использую решение @ rakaloof без JQuery (потому что оно вам здесь не нужно ). Спасибо за идею! Вот решение на основе форм vanillaJS:

const uri = 'https://upload.wikimedia.org/wikipedia/commons/b/bb/Test_ogg_mp3_48kbps.wav';
let form = document.createElement("form");
form.setAttribute('action', uri);
document.body.appendChild(form);
form.submit();
document.body.removeChild(document.body.lastElementChild);

aloisdg переходит на codidact.com
источник