【发布时间】:2015-09-02 20:45:10
【问题描述】:
为简单起见,我尝试使用 php 显示图像以帮助 try 并防止任何类型的安全漏洞。我有通过 php 脚本读取的图像,我想渲染它,所以我不想去http://example.com/path/to/uploads/dir/image.jpg,我想让用户能够去http://example.com/path/to/script/image1,让他们能够看到图像。
这样我可以将图像路径 (http://example.com/path/to/uploads/dir/) 隐藏在我的文档根目录之外(到域路径无法直接访问的位置)。因此,如果域的路径是 /path/to/public_html/,那么我希望将图像上传到 /path/to/uploads/,这样您在浏览我的域时就无法导航到上传目录。
我的问题是我一直在尝试渲染的图像,无法渲染,我不确定为什么。 MD5 校验和相同,HTTP 标头也相似。图像的direct path 与图像的desired path 相比。
我使用 Laravel 作为框架/主干,但我认为这并不重要,我渲染图像的代码如下
public function getImage($id){
$img = TitanImage::findOrFail($id);
// header('Content-type: image/jpeg');
// header('Content-Length: ' . filesize($img->path));
// header('Accept-Ranges: bytes');
// echo file_get_contents($img->path);
$file = $img->path;
$type = 'image/jpeg';
header('Content-Type:'.$type);
header('Content-Length: ' . filesize($file));
readfile($file);
// exit();
return;
}
我还使用webconfs 来检查所需图像端点的标头。
编辑 1
关于intervention/image 包的其中一个cmets,我更改了代码,但仍然得到相同的结果;但是,内容长度发生了变化,变得更长了。
public function getImage($id){
$img = TitanImage::findOrFail($id);
// header('Content-type: image/jpeg');
// header('Content-Length: ' . filesize($img->path));
// header('Accept-Ranges: bytes');
$file = $img->path;
return Image::make(trim($file,' '))->response();
}
编辑 2
在此编辑中,@Digitlimit 提到了检查图像是否存在。这是我当前的代码。
public function getImage($id){
$img = TitanImage::findOrFail($id);
$file = $img->path;
if(file_exists($file))
return Image::make($file)->response('jpg');
else
return 'File doesnt exist';
}
我也做了测试,看看如果我只返回 $file 而不是 Image::make 实例会发生什么,我得到了正确的路径,即。当我通过 SSH 进入服务器并将 cd 转到路径减去图像名称时,路径存在并且具有权限。当我执行ls -la 命令时,它会列出图像并且它也具有适当的权限。
【问题讨论】:
-
术语错误。 “在我的领域之后”。它应该在“我的文档根目录之外”。
-
为什么不使用超棒的干预图像。请参阅类似问题的答案:stackoverflow.com/questions/30875139/…
-
@Digitlimit 我更新了我的代码,我仍然没有改变,我也更新了问题。
-
您安装了干预镜像吗?如果是,您需要创建一条路线。另请说明您的图片所在位置
-
我按照intervention.io网站上的说明,创建了一个路由,根据存储在数据库中的路径检索图像,这是我问题中的代码。我正在制作图像并返回响应。
标签: php image laravel image-processing