【发布时间】: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