使用PHP readfile的零星损坏图像

使用PHP readfile的零星损坏图像,php,image,http-headers,jpeg,readfile,Php,Image,Http Headers,Jpeg,Readfile,我搜索了类似的请求/问题,但似乎没有任何内容符合我的情况 我使用PHP文件将上传的文件发送/输出到浏览器。我将PHP文件称为“reader”文件。以下是该阅读器的简化版本(为了简单起见,删除了其他文件类型): 正如您将在下面的示例中看到的,它通常是有效的。但当浏览器必须以这种方式加载多个图像时,有些图像不会加载/显示为已损坏。您可以在此处看到一个正在运行的示例:。如果您一开始在照片网格中没有看到任何损坏的图像,请尝试一些硬刷新 你知道为什么这对多个文件/图像不可靠吗 请注意,我有一个额外的脚

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

我使用PHP文件将上传的文件发送/输出到浏览器。我将PHP文件称为“reader”文件。以下是该阅读器的简化版本(为了简单起见,删除了其他文件类型):


正如您将在下面的示例中看到的,它通常是有效的。但当浏览器必须以这种方式加载多个图像时,有些图像不会加载/显示为已损坏。您可以在此处看到一个正在运行的示例:。如果您一开始在照片网格中没有看到任何损坏的图像,请尝试一些硬刷新

你知道为什么这对多个文件/图像不可靠吗

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


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

如果您的间接下载脚本仅用于添加标题,请调查是否可以使用:


为了减少脚本负载,可以使用
readfile
X-Sendfile:
头,这样Apache进程可以处理读取/发送。(如果文件以某种方式通过网络文件系统进行映射,则应该是可能的。)

如果并行加载多个映像,则可能会耗尽允许的进程或内存(在共享主机上)。但这很难说清楚。尝试从命令行运行并发curl请求以进行调试。是的,这是一个共享托管平台。您可能知道如何帮助管理我的脚本中的进程/内存吗?和/或,您能否提供更多有关curl调试建议的指导?非常感谢。请注意,您的脚本将很乐意提供服务器上的任何文件<代码>http://example.com/script.php?upload=../../../../../../../../seekrit.passwords。希望你没有任何想要保密的内容。根据我的帖子:“我最初在服务器管理员不允许上传到Web服务器的站点上使用reader脚本/文件,但要求所有用户上传都存储在单独的sandlot服务器上。”“文件允许我访问和输出这些文件,因为无法直接指向sandlot文件的URL。“我现在普遍使用它,以避免无论是否使用沙地,都必须运行不同的例程。我会查X-Sendfile的。再次感谢。@MarcB谢谢,但只有当脚本在我的请求中发布时才起作用。出于这个目的(仅此),我删除了一系列安全措施来简化一些事情。它首先检测所述站点是否正在使用沙地(通过站点配置设置)。然后,它基于该配置动态构建文件路径,然后随文件一起发送。因此,我认为剧本是必要的。而且,这是在Apache和IIS服务器上运行的,所以听起来我必须使用X-Sendfile方法基于平台编写两个不同的版本。我将继续研究进程/内存管理…如果您在这方面有任何其他线索,将不胜感激。
<?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>";
    }
?>