无法从文件 .SVG 中读取图像 (intervention/image)

Unable to read image from file .SVG (intervention/image)

所以我正在制作一个图像上传器,我想在其中制作缩略图但也支持 svg,因为 GD 不支持 svg 类型我首先尝试在 config/image 中切换到 imagick。php 文件,但这并没有改变任何东西。

我不确定它是否支持它,我是否缺少必须安装的必需软件包?如果是哪一个?

但是话虽如此,当我尝试上传 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() 但它只是说图像不能 opened/read 要么。

$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]);
}

但我发现这是一种相当老套的方法。没有更好的方法来过滤掉或支持整个 intervention/image 包的 svg 类型吗?

提前感谢您提供更多信息!

因此,通过进一步的实验并尝试在 intervention/image 库中找到一些有用的东西,但不将 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 图像转换为缩略图时,我可能会调查它。但是现在这就可以了,因为 .svg 还没有用于网站开发,我在负载方面也可以放心。

无论如何,我感谢所有试图帮助我解决这个问题的人!