使用PHP readfile的零星破碎图像

时间:2011-10-26 15:45:46

标签: php image http-headers jpeg readfile

我搜索了类似的请求/问题,但似乎没有任何东西符合我的情况。

我使用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。如果您最初没有在照片网格中看到任何损坏的图像,请尝试一些硬刷新。

为什么这对多个文件/图像不可靠?

请注意,我有一个额外的脚本可以重新调整示例中的图像大小,但这不是罪魁祸首。我删除它,问题仍然存在。

更多背景(关于我使用此方法的原因):我最初开始在服务器管理员不允许上传到网络服务器的网站上使用阅读器脚本/文件,而是要求所有用户上传都存储在一个单独的sandlot服务器。 “reader”文件允许我访问和输出这些文件,因为无法直接访问sandlot文件。

1 个答案:

答案 0 :(得分:0)

如果您的间接下载脚本只是用于添加标题,那么如果您可以使用以下内容进行调查:

为了减少脚本加载,readfile的替代方法是:mod_xsendfileX-Sendfile:标头,因此Apache进程处理读取/发送。 (如果通过网络文件系统以某种方式映射文件,则应该可以。)