загрузить файл с помощью запроса ajax

Я хочу отправить «запрос загрузки ajax», когда я нажимаю кнопку, поэтому я попытался таким образом:

JavaScript:

var xhr = new XMLHttpRequest(); xhr.open("GET", "download.php"); xhr.send(); 

download.php:

 <? header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename= file.txt"); header("Content-Transfer-Encoding: binary"); readfile("file.txt"); ?> 

но не работает должным образом, как я могу это сделать? заранее спасибо

Обновление 27 апреля 2015 г.

Вверх и переход на сцену HTML5 – это атрибут загрузки . Он поддерживается в браузере Firefox и Chrome, и вскоре появится в IE11. В зависимости от ваших потребностей вы можете использовать его вместо запроса AJAX (или используя window.location ), если файл, который вы хотите загрузить, находится в том же месте, что и ваш сайт.

Вы всегда можете сделать запрос AJAX / window.location резервным, используя некоторый JavaScript, чтобы проверить, поддерживается ли download а если нет, переключение на вызов window.location .

Оригинальный ответ

У вас не может быть запрос AJAX, чтобы открыть приглашение загрузки, так как вы физически должны перейти к файлу, чтобы запросить загрузку. Вместо этого вы можете использовать функцию успеха, чтобы перейти к download.php. Это откроет приглашение загрузки, но не изменит текущую страницу.

 $.ajax({ url: 'download.php', type: 'POST', success: function() { window.location = 'download.php'; } }); 

Несмотря на то, что это отвечает на вопрос, лучше просто использовать window.location и полностью исключить запрос AJAX.

Для этого вам вообще не нужен ajax. Если вы просто установите «download.php» как href на кнопке или, если это не ссылка, используйте:

 window.location = 'download.php'; 

Браузер должен распознавать двоичную загрузку, а не загружать фактическую страницу, а просто обслуживать файл как загрузку.

Возможно. Вы можете загрузить загрузку изнутри функции ajax, например, сразу после создания CSV-файла.

У меня есть функция ajax, которая экспортирует базу данных контактов в CSV-файл, и сразу после ее завершения автоматически запускает загрузку файла .csv. Итак, после получения ответаText и все в порядке, я перенаправляю браузер следующим образом:

 window.location="download.php?filename=export.csv"; 

Мой файл download.php выглядит так:

 <?php $file = $_GET['filename']; header("Cache-Control: public"); header("Content-Description: File Transfer"); header("Content-Disposition: attachment; filename=".$file.""); header("Content-Transfer-Encoding: binary"); header("Content-Type: binary/octet-stream"); readfile($file); ?> 

Нет обновления страницы, и файл автоматически загружается.

ПРИМЕЧАНИЕ. – Протестировано в следующих браузерах:

 Chrome v37.0.2062.120 Firefox v32.0.1 Opera v12.17 Internet Explorer v11 

Чтобы браузер загрузил файл, вам необходимо сделать такой запрос:

  function downloadFile(urlToSend) { var req = new XMLHttpRequest(); req.open("GET", urlToSend, true); req.responseType = "blob"; req.onload = function (event) { var blob = req.response; var fileName = req.getResponseHeader("fileName") //if you have the fileName header available var link=document.createElement('a'); link.href=window.URL.createObjectURL(blob); link.download=fileName; link.click(); }; req.send(); } 

Я предпочитаю Location.assign ()

developer.mozilla.org/en-US/docs/Web/API/Location.assign

Декодирование имени файла из заголовка немного сложнее …

 var filename = "default.pdf"; var disposition = req.getResponseHeader('Content-Disposition'); if (disposition && disposition.indexOf('attachment') !== -1) { var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; var matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, ''); 

}