Intereting Posts
Как проверить, существует ли идентификатор электронной почты? simpleXML: синтаксический анализ XML для вывода только атрибутов элементов Должен ли массив быть объявлен перед его использованием? PHP, получение переменной из другого php-файла Входное значение 0 = пустое? Как я могу заставить программы электронной почты показывать изображения, отправляемые в html-адрес электронной почты, используя php? метод post-событий fullCalendar для MySQL WordPress: проверьте, есть ли предыдущие сообщения перед отображением ссылки PHP – очень простой XMLReader Как я могу автоматически настроить ширину изображения, созданного GD, в соответствии с текстом? mod_rewrite Несколько переменных и подпапок Как добавить столбец атрибутов продукта в таблицу sales_flat_order_item? Закрепление файлов в папке без родительской папки в зашифрованном файле Пользователь не распознается через Parse \ ParseUser, но существует в $ _SESSION Laravel 4 – протоколирование SQL-запросов

Force Загрузить через Ajax и PHP

Я хочу создать загрузочный скрипт, который позволяет 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: ОБНОВЛЕНИЕ СКРИПТА

Related of "Force Загрузить через Ajax и PHP"

Вы не можете загружать файлы с помощью 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.