Я хочу отправить «запрос загрузки 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, '');
}