PHP принудительная загрузка не работает? - PullRequest
8 голосов
/ 27 января 2011

На моей HTML-странице я сделал ajax-запрос JQuery к php-скрипту, который должен вызвать загрузку, но ничего не происходит?

На моей html-странице (в обработчике события click для ссылки) ...

var file = "uploads/test.css";
$.ajax(
{
    type      : "POST",
    url       : "utils/Download_File.php",
    data      : {"file":file}
})

А скрипт Download_File.php выглядит так

<?php

Download_File::download();

class Download_File
{
    public static function download()
    {
        $file = $_POST['file'];

        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment');
        readfile('http://localhost/myapp/' . $file);
        exit;
    }
}
?>

Но по какой-то причине ничего не происходит?Я посмотрел на заголовки ответа в firebug и не вижу никаких проблем.Я использую Xampp.Любая помощь очень ценится.

Спасибо!

Ответы [ 2 ]

9 голосов
/ 27 января 2011

Вы должны указать Content-Transfer-Encoding.Кроме того, вы должны указать filename на вашем Content-Disposition.

header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Content-Disposition: attachment; filename="'.$file.'"');
readfile('http://localhost/myapp/'.$file);
exit;

Важно включать двойные кавычки вокруг filename, поскольку это требуется для RFC 2231 .Известно, что Firefox испытывает проблемы с загрузкой файлов с пробелами в имени файла, если filename не заключен в кавычки.

Кроме того, проверьте, чтобы после закрытия ?> не было пробелов.Если после закрывающего тега PHP даже есть пробел, заголовки не будут отправлены в браузер.

В качестве примечания, если у вас есть несколько общих типов файлов, которые вы собираетесь предлагать для загрузкиВы могли бы рассмотреть возможность определения этих типов MIME.Это обеспечивает лучший опыт для конечного пользователя.Например, вы можете сделать что-то вроде этого:

//Handles the MIME type of common files
$extension = explode('.', $file);
$extension = $extension[count($extension)-1];
SWITCH($extension) {
  case 'dmg':
    header('Content-Type: application/octet-stream');
    break;
  case 'exe':
    header('Content-Type: application/exe');
    break;
  case 'pdf':
    header('Content-Type: application/pdf');
    break;
  case 'sit':
    header('Content-Type: application/x-stuffit');
    break;
  case 'zip':
    header('Content-Type: application/zip');
    break;
  default:
    header('Content-Type: application/force-download');
    break;
}
3 голосов
/ 02 февраля 2011

Хорошо, я наконец смог заставить это работать с помощью плагина JQuery, найденного здесь:

http://www.filamentgroup.com/lab/jquery_plugin_for_requesting_ajax_like_file_downloads/.

Работает нормально сейчас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...