Спорадические битые изображения с использованием PHP readfile - PullRequest
1 голос
/ 26 октября 2011

Я искал похожие запросы / вопросы, но, похоже, ничего не соответствует моей ситуации.

Я использую файл PHP для отправки / вывода загруженных файлов в браузер.Я называю файл PHP файлом «читателя».Ниже приведена развернутая версия программы чтения (для простоты удалены дополнительные типы файлов):

<?php
    if($_GET['upload']){ // for files uploaded via CMS uploader
        $file = $site_directory . $uploads_path . $_GET['upload'];
    }
    if (file_exists($file)) {
        header('Content-Description: File Transfer');
        // JPG
        if(strstr($file,".jpg"))
        {
            header('Content-type: image/jpeg');
            header('Content-Disposition: inline; filename='.basename($file));
        // OTHER FILE TYPES
        }else   
        {
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
        }
        header('Content-Transfer-Encoding: binary');
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: ' . filesize($file));
        ob_clean();
        flush();
        readfile($file);
        exit;
    }else{
        echo "<p>That file does not exist.</p>";
    }
?>

Как вы увидите в следующем примере, в целом это работает.Но когда браузер должен загрузить несколько изображений таким образом, некоторые из них не будут загружаться / выглядеть как поврежденные.Вы можете увидеть пример этого в действии здесь: http://www.technotarek.com/index.php?id=25&view=grid. Если вы сначала не видите разбитых изображений в сетке фотографий, попробуйте несколько серьезных обновлений.

Есть идеи, почему это не надежно для нескольких файлов / изображений?

Обратите внимание, что у меня есть дополнительный скрипт, который изменяет размеры изображений в примере, но это не преступник.Я удалил его, и проблема осталась.

Дополнительные сведения (о том, почему я использую этот метод): я изначально начал использовать скрипт / файл для чтения на сайтах, где администраторы сервера не разрешали загрузку на веб-сервер, но вместо этого требовали, чтобы все пользовательские загрузки былихраниться на отдельном изолированном сервере.Файл «reader» позволяет мне получать доступ к этим файлам и выводить их, поскольку прямой URL-адрес файлов sandlot невозможен.

1 Ответ

0 голосов
/ 26 октября 2011

Если ваш скрипт косвенной загрузки служит только для добавления заголовка, тогда можно использовать исследование:

Чтобы уменьшить загрузку скрипта, альтернативой readfile будет: mod_xsendfile и заголовок X-Sendfile:, поэтому процесс Apache обрабатываетчтение / отправка.(Должно быть возможно, если файлы отображаются каким-либо образом через сетевую файловую систему.)

...