【问题标题】:Unable to read image from file .SVG (intervention/image)无法从文件 .SVG 中读取图像(干预/图像)
【发布时间】: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


【解决方案1】:

因此,通过进一步的实验并尝试使用干预/图像库,但不将 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]);
}

虽然在我看来有点牵强,而且是一种 hacky 方法,但似乎仍然可以与我的文件系统一起工作,因为我的文件系统需要一个拇指来处理每个图像。

当我进一步扩展我的网站的使用以最终将 SVG 图像转换为缩略图时,我可能会考虑它。但是现在这会做,因为 .svg 还没有用于网站开发,所以在负载方面我也可以放心。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多