Я пытаюсь использовать 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();
Спасибо за ответы на все вопросы!