Php 无法从.SVG文件中读取图像(干预/图像)

Php 无法从.SVG文件中读取图像(干预/图像),php,image,laravel,svg,intervention,Php,Image,Laravel,Svg,Intervention,因此,我正在制作一个图像上传程序,其中我想制作缩略图,但也支持svg,因为GD不支持svg类型,我首先尝试在config/image.php文件中切换到imagick,但这并没有改变任何事情 我不确定,因为它确实声明它支持它,我是否缺少必须安装的必需软件包?如果是,哪一个 但话说回来,当我尝试上传svg图像时,它会声明: NotReadableException in Decoder.php line 20: Unable to read image from file (D:\xampp\ht

因此,我正在制作一个图像上传程序,其中我想制作缩略图,但也支持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类型为基础,在我的案例中,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转换为任何内容的情况下,我采用了以下解决方案:

public function dropzoneStore(Request $request){
    $image = $request->file('file');
    $imageName = date("dHis-").preg_replace("/[^a-zA-Z0-9.]/","",$image->getClientOriginalName());
    $uploadPath = public_path('up/').date("Y/m");
    $image->move($uploadPath,$imageName);
    //Thumbnail Creation
    $thumbPath = $uploadPath.'/thumbs/';
    File::isDirectory($thumbPath) or File::makeDirectory($thumbPath,0775,true,true);
    if($image->getClientOriginalExtension() != 'svg'){
        $imageThmb = Image::make($uploadPath.'/'.$imageName);
        $imageThmb->fit(300,300,function($constraint){$constraint->upsize();})->save($uploadPath.'/thumbs/thm_'.$imageName,80);
    }else{
        File::copy($uploadPath.'/'.$imageName,$uploadPath.'/thumbs/thm_'.$imageName);
    }
    return response()->json(['success'=>$imageName]);
}
在我看来,这虽然有点牵强,而且是一种骇人的方法,但似乎仍然能够与我的文件系统配合使用,因为我的文件系统需要对每个图像都使用拇指

当我进一步扩展我的网站的使用,最终将SVG图像转换为缩略图时,我可能会研究它。但就目前而言,这就行了,而且as.svg还没有用于网站开发,我可以放心地处理负载问题


不管怎样,我都要感谢所有在这件事上帮助我的人

不幸的是,干预不支持SVG,即使
Imageick
支持SVG,它也不会以您想要的方式工作。这是因为即使是
Imageick
也不支持在SVG文件上调整大小。我的建议是让用户在上传之前将其转换为PNG或其他格式,或者在发送之前使用JavaScript库将其转换为PNG文件,首先在HTML5画布元素中呈现。祝你好运。好吧,这澄清了为什么GD和Imageick都没有改变手头的问题的解释。但是,我确实希望保持SVG图像格式,而不是转换它。首先,我并不需要对SVG图像使用任何拇指,因为它毕竟是SVG,可以正确地调整大小,但我确实需要找到一种绕过错误的方法。如果文件扩展名包含svg,则当前的方式只是绕过thumb创建。虽然这对thumb创建确实有效,但我的另一个文件系统依赖于整个thumb创建,然后需要再次检查svg。因此我不确定是否有更简单的方法来处理这个问题,如果文件是相同的,则将文件保存两次,一次保存在thumb中,另一次保存在原始文件中,这有点愚蠢。但是,由于我的文件系统依赖于根据thumbs/thm显示所有最近的图像,我现在不确定这样做是否是一个好主意,或者在每个检查器上添加一个过滤器,在其中使用thumbs的文件路径。注:这500个字符的限制评论非常烦人:|