【问题标题】:Sporadic broken images using PHP readfile使用 PHP 读取文件的零星损坏图像
【发布时间】:2011-12-15 20:31:11
【问题描述】:

我搜索了类似的请求/问题,但似乎没有什么符合我的情况。

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

任何想法为什么这对于多个文件/图像不可靠?

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

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

【问题讨论】:

  • 如果您正在并行加载多个图像,那么您可能会用完允许的进程或内存(无论如何在共享主机上)。但这很难肯定地说。尝试从命令行运行并发 curl 请求以进行调试。
  • 是的,这是一个共享托管平台。您可能知道帮助管理我的脚本中的进程/内存吗?和/或,您能否提供更多关于 curl 调试建议的指导?非常感谢。
  • 请注意,您的脚本将愉快地提供服务器上的任何文件。 http://example.com/script.php?upload=../../../../../../../../seekrit.passwords。希望您没有任何想要保密的内容。
  • 根据我的帖子:“我最初开始在服务器管理员不允许上传到网络服务器的网站上使用阅读器脚本/文件,而是要求将所有用户上传的内容存储在单独的沙槽中服务器。“阅读器”文件允许我访问和输出这些文件,因为无法直接访问沙盘文件。”我现在普遍使用它,以避免无论是否使用沙地都必须运行不同的例程。我将研究 X-Sendfile。再次感谢。
  • @MarcB 谢谢,但这仅在使用我的请求中发布的脚本时才有效。出于这个目的(仅),我删除了一堆简单的安全措施。

标签: php image http-headers jpeg readfile


【解决方案1】:

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

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

【讨论】:

  • 完整的脚本做了更多的事情。它首先检测相关站点是否正在使用沙地(通过站点配置设置)。然后它会根据该配置动态构建文件路径,然后将文件发送出去。因此,我认为脚本是必要的。此外,这是在 Apache 和 IIS 服务器上运行的,所以听起来我必须使用 X-Sendfile 方法基于平台编写两个不同的版本。我将继续研究进程/内存管理...您在这方面的任何其他线索将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2015-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多