【发布时间】:2017-05-21 20:20:33
【问题描述】:
所以我正在制作一个图像上传器,我想在其中制作缩略图,但也支持 svg,因为 GD 不支持 svg 类型,我首先尝试在 config/image.php 文件中切换到 imagick,但没有什么都改变不了。
我不确定,因为它确实声明它支持它,我是否缺少我必须安装的必需包?如果有,是哪一个?。
但话虽如此,当我尝试上传 svg 图片时,它会指出:
NotReadableException in Decoder.php line 20:
Unable to read image from file (D:\xampp\htdocs\laravel\public\up/2017/01/07000323-logoSep.svg).
我首先尝试使用简单的 IF 结构来解决这个问题,因为我真的不需要 SVG 图像的缩略图,使用 ->mime() 但它只是说图像也无法打开/读取。
$image = $request->file('file');
$imageName = date("dHis-").$image->getClientOriginalName();
$uploadPath = public_path('up/').date("Y/m");
$image->move($uploadPath,$imageName);
$imageMime = Image::make($uploadPath.'/'.$imageName);
if($imageMime->mime() != "image/svg+xml"){}
首先我认为这是由权限问题引起的,所以我确保我的所有文件都是可读写的,但这并没有改变问题。
所以我尝试将自己基于实际的扩展而不是 mime 类型,这在我的情况下确实有效,如下所示:
public function dropzoneStore(Request $request){
$image = $request->file('file');
$imageName = date("dHis-").$image->getClientOriginalName();
$uploadPath = public_path('up/').date("Y/m");
$image->move($uploadPath,$imageName);
if($image->getClientOriginalExtension() != 'svg'){
$imageThmb = Image::make($uploadPath.'/'.$imageName);
$imageThmb->fit(300,300,function($constraint){$constraint->upsize();})->save($uploadPath.'/thm_'.$imageName,80);
}
return response()->json(['success'=>$imageName]);
}
但我发现这是一种相当老套的方法。难道没有更好的方法来过滤或支持整个干预/图像包的 svg 类型吗?
提前感谢您提供更多信息!
【问题讨论】:
-
不幸的是,干预不支持 SVG,即使
Imageick确实支持 SVG,它也不会以您想要的方式工作。这是因为即使Imageick也不支持调整 SVG 文件的大小。我的建议是让用户在上传之前将其转换为 PNG 或其他方式,或者使用 JavaScript 库将其转换为 PNG 文件,然后通过首先在 HTML5 画布元素中呈现它来发送它。祝你好运。 -
好吧,这解释了为什么 GD 和 Imageick 都没有改变手头的问题。但是我确实想维持 SVG 图像格式而不是转换它。首先,我真的不需要 SVG 图像的任何拇指,因为它毕竟是 SVG,所以它可以正确调整大小,但我确实需要找到一种方法来解决这个错误。如果文件扩展名包含 svg,则当前的方式只是绕过拇指创建。虽然这确实适用于拇指创建,但我的其他文件系统依赖于整个拇指创建,然后需要再次检查 svg。
-
所以我不确定是否有更简单的方法来处理这个问题,将文件保存两次有点愚蠢,一次保存在拇指中,一次保存在原始文件中相同。但是话又说回来,因为我的文件系统依赖于根据拇指/thm 显示所有最近的图像,我现在不确定这样做是否只是一个好主意,或者在每个检查器上添加一个过滤器使用拇指的文件路径。 PS:这 500 个字符限制的 cmets 很烦人:|
标签: php image laravel svg intervention