Intereting Posts
Передавать объект или массив PHP с одного сайта на другой сайт? Как я могу вызвать статический метод из класса, если все, что у меня есть, – это строка имени класса? Как установить wkhtmltopdf с привязками PHP в Linux (centos) Как заменить регулярное выражение в MySQL? PHP Предупреждение: mysqli_connect (): (HY000 / 2002): соединение отклонено Тег DIV, создающий новую строку в php изменить CakePhp1.3 URL-адрес назначения paginator? Как защищать паролем файлы (изображения, видео, zip) динамически от публики и разрешать доступ только к членам? получение результатов MySQL в виде массива PHP Загрузка приветствующей анимации только после jquery / php Как получить intellisense для индекса ассоциативного массива PHP? Многомерный массив и агрегатные функции в MySQL с использованием PHP? Как эта защита CSRF работает? Почему move_uploaded_file не работает для меня Laravel Eloquent toArray не использует квадратные скобки

Загрузка файла Force Force

Я пытаюсь использовать PHP для принудительной загрузки на клиентском компьютере (с диалоговым окном файла – ничего зловещего). Я нашел много страниц, которые рекомендуют использовать функцию header () для управления ответом из моего PHP-скрипта, но мне не повезло с этим. Код, который у меня есть, следующий:

$file = $_POST['fname']; if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) { die('File not found.'); } else { header('Pragma: public'); header('Content-disposition: attachment; filename="tasks.zip"'); header('Content-type: application/force-download'); header('Content-Length: ' . filesize($file)); header('Content-Description: File Transfer'); header('Content-Transfer-Encoding: binary'); header('Connection: close'); ob_end_clean(); readfile($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file); } 

Я называю это с помощью этого JavaScript:

  $.ajax({ url: url, success: function(text) { var req = new XMLHttpRequest(); req.open("POST", 'php/utils/getXMLfile.php', true); req.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); req.send('fname=' + encodeURIComponent(text)); } }); 

Это возвращает содержимое файла в виде текста, но не вызывает диалоговое окно загрузки. У кого-нибудь есть предложения?

Вместо использования AJAX просто перенаправьте браузер на соответствующий URL-адрес. Когда он получит заголовок content-disposition:attachment , он загрузит файл.

Несколько предложений:

1.

 if(!($baseDir . '\\AgcommandPortal\\agcommand\\php\\utils\\ISOxml\\' . $file)) { 

Вместо:

 if(!file_exists($baseDir ....)){ 

2. Не нужен размер.

3. Попробуйте следующее:

  header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($fullpath)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); ob_clean(); flush(); readfile($fullpath); exit; 

Я бы попытался отправить заголовок из PHP, как это, чтобы заменить заголовок application/force-download :

 header("Content-type: application/octet-stream"); 

Ответ Kolink работал для меня (измените расположение окна на файл php), но поскольку я хочу отправить переменные POST вместе с запросом, я в итоге использовал скрытую форму. Код, который я использую, выглядит следующим образом:

  var url = 'php/utils/getXMLfile.php'; var form = $('<form action="' + url + '" method="post" style="display: none;">' + '<input type="text" name="fname" value="' + text + '" />' + '</form>'); $('body').append(form); $(form).submit(); 

Спасибо за ответы на все вопросы!