Вопрос по php, download – PHP Force File Download [копия]

2

This question already has an answer here:

Forcing to download a file using PHP 10 answers

Я пытаюсь использовать 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));
            }
        });

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

Я бы не стал считать это дубликатом. Здесь проблема немного в другом. Проблема в том, что результат действия post не вызывает поведение загрузки, указанное в заголовке ответа, сгенерированного php. ALoopingIcon

Ваш Ответ

4   ответа
1

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

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;
Я получаю текстовое содержимое файла в ответе, но не окно загрузки Crash
Всякий раз, когда я включаю flush (), я не получаю никакого вывода. Crash
а когда не включал?
0

p), но, поскольку я хочу отправить переменные 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();

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

0

как это, чтобы заменить вашapplication/force-download заголовок:

header("Content-type: application/octet-stream");
Я тоже это пробовал Crash
6

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

@ Сбой, он не будет перенаправлен, просто "сохранить файл" появится диалоговое окно ...
... и исправить дыру в безопасности, заменив$file = $_POST['fname']; с$file = basename($_POST['fname']);
+1 Совершенно верно, зачем вам использовать AJAX, если вам не нужен результат вызова?
Если я перенаправлю браузер, не очистит ли он уже загруженную страницу? Это несколько проблематично, так как это лишь небольшая часть гораздо большей страницы. Crash
Мне нужен результат - ситуация сложная. Я вызываю сценарий PHP, который вызывает сценарий ASP (несколько программистов используют несколько языков и странные взаимодействия), а затем возвращает имя файла, созданного ASP. Затем имя файла отправляется в приведенный выше код PHP, где оно предназначено для загрузки. Хотя теперь, когда я думаю об этом, я, вероятно, мог бы сделать это без второго звонка, но проблема с тем, чтобы заставить загрузку работать, все еще остается проблемой. Crash

Похожие вопросы