Я хочу создать загрузочный скрипт, который позволяет Force Download JPG. Это мой php-скрипт:
<?php header("Pragma: public"); // required header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Description: File Transfer"); header("Content-Type: image/jpg"); header('Content-Disposition: attachment; filename="'.basename($GET['a']).'"'); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize(($GET['a'])); readfile(($GET['a']); ?>
Это сегмент кода моего js-кода:
function downloadFile(a){ document.location = "download.php?a="+ a; }
В этом примере кода ничего не происходит. Если я добавлю результат в HTML-тег, он покажет содержимое файла.
Любые идеи, как научить браузер загружать этот файл?
EDIT: ОБНОВЛЕНИЕ СКРИПТА
Вы не можете загружать файлы с помощью ajax. Итак, если у вас есть что-то, что должно произойти в ajax, вы должны вернуть url в ответ и применить его, как document.location = "url"
чтобы начать процесс загрузки.
Одно замечание здесь. Насколько я помню, браузер блокирует загрузку файла, если он инициирован не щелчком пользователя. Итак, это будет нормально работать:
.click(function(){ document.location = "download url" })
Но если он запускается не кликом пользователя, он будет заблокирован. Итак, код выглядит так:
.click(function(){ $.ajax({..., success:function(download_url_from_server){ document.location = download_url_from_server; }}); })
будет заблокирован браузером. Итак, если вы хотите передать некоторые данные в сообщение, вы можете отправить форму в скрытый iframe или на пустую страницу, используя <form target="..."
:
function checkToken(token){ var $form = $("#downloadForm"); if ($form.length == 0) { $form = $("<form>").attr({ "target": "_blank", "id": "downloadForm", "method": "POST", "action": "script.php" }).hide(); $("body").append($form); } $form.find("input").remove(); var args = { a: "checkToken", b: token } for (var field in args) { $form.append($("<input>").attr({"value":args[field], "name":field})); } $form.submit(); }
И в script.php вам нужно немедленно выполнить код из download.php, если токен в порядке или сделать перенаправление на сценарий загрузки:
header("Location: download.php?a=" . $filename)
Установка типа mime на image/jpeg
, скорее всего, не будет работать. Итак, вам нужно application/octet-stream
чтобы принудительно загрузить.
Замените заголовок типа контента на вашем php следующим:
header('Content-Type: application/octet-stream');
Кроме того, одним хорошим решением вместо использования document.location
является вставка iframe. Используйте следующую функцию в своем обратном вызове
function downloadFile(url) { var iframe; iframe = document.getElementById("download-container"); if (iframe === null) { iframe = document.createElement('iframe'); iframe.id = "download-container"; iframe.style.visibility = 'hidden'; document.body.appendChild(iframe); } iframe.src = url; }
Кажется, у вас есть ошибки в вашем скрипте. Прежде всего, правильное значение для переменной GET равно $ _GET ['a'], а не $ GET ['a']. Вторая проблема заключается в том, что у вас есть дополнительная открывающая скобка, когда я скопировал ваш код, я получил ответ 500 Internal Server Error. Если мы исправим ошибки, это, похоже, сработает. Просто попробуйте исправленную версию вашего кода.
<?php header("Pragma: public"); // required header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Description: File Transfer"); header("Content-Type: image/jpg"); header('Content-Disposition: attachment; filename="'.basename($_GET['a']).'"'); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize($_GET['a'])); readfile($_GET['a']); ?>
Ваш подход прав, и вам не нужно ничего делать в обратном вызове AJAX. По-видимому, вы пропустите заголовок Content-Description: File Transfer
. Добавьте его, и он заставит браузер открыть диалог сохранения файла (или просто сохранить в папку по умолчанию, в зависимости от ваших настроек).
Вы немного запутались. Как отметил Файнгель, вы не можете скачивать файлы через AJAX. То, что вам нужно сделать, – перенаправить пользователя на другую страницу, в которой есть ваш вышеприведенный PHP-код. Этот PHP-код должен позволить пользователю напрямую загрузить файл. То, что вы пытаетесь, абсолютно возможно, вам просто нужно приблизиться к нему с другого направления, то есть не с AJAX.