干预图像:不支持编码格式(png?v = 73d79a89bded& a)

时间:2015-10-21 21:07:59

标签: php image laravel laravel-5 intervention

我正在使用Laravel 5 Embed包来获取外部链接的元数据。然后我使用Intervention Image包来操作链接的默认图像并将其保存在磁盘上。

一切正常,直到我尝试提交StackOverflow问题的链接。然后我得到错误

  

AbstractEncoder.php第149行中的NotSupportedException:

     

不支持编码格式(png?v = 73d79a89bded& a)。

     

在AbstractEncoder.php第149行

     

at AbstractEncoder-> process(object(Image),'png?v = 73d79a89bded& a',null)>在AbstractDriver.php第77行

     

在AbstractDriver->编码(对象(图像),'png?v = 73d79a89bded& a',null)> Image.php第119行

     

at Image->编码('png?v = 73d79a89bded& a',null)在Image.php第139行

     

在PostsController.php第70行中的Image-> save('C:\ xampp \ htdocs \ r2 \ public / images / rwSuGpEB.png?v = 73d79a89bded& a')

如何在Laravel和干预套餐中处理此问题?

如何从?v=73d79a89bded&a移除basename()

这是create()

中的PostsController方法
public function store(PostRequest $request)
{
    if (Input::has('link')) {
        $input['link'] = Input::get('link');
        $info = Embed::create($input['link']);

        if ($info->image == null) {
            $embed_data = ['text' => $info->description];
        } else if ($info->description == null) {
            $embed_data = ['text' => ''];
        } else {
            $extension = pathinfo($info->image, PATHINFO_EXTENSION);

            $newName = public_path() . '/images/' . str_random(8) . ".{$extension}";

            if (File::exists($newName)) {
                $imageToken = substr(sha1(mt_rand()), 0, 5);
                $newName = public_path() . '/images/' . str_random(8) . '-' . $imageToken . ".{$extension}";
            }
            // This is line 70
            $image = Image::make($info->image)->fit(70, 70)->save($newName);
            $embed_data = ['text' => $info->description, 'image' => basename($newName)];
        }

        Auth::user()->posts()->create(array_merge($request->all(), $embed_data));

        return redirect('/subreddit');
    }
    Auth::user()->posts()->create($request->all());

    return redirect('/subreddit');
}

2 个答案:

答案 0 :(得分:3)

如果您的图片名称,最后会有一个查询字符串?v=73d79a89bded&a。该查询字符串被错误地解释为图像文件扩展名的一部分。

在进一步处理之前删除该查询字符串。

<强>更新

假设$ extension包含不需要的查询字符串

$orig = pathinfo($info->image, PATHINFO_EXTENSION);
$extension = substr($orig, 0, strpos($orig, '?'));

答案 1 :(得分:1)

您似乎正在接受网址,因此您应首先使用parse_url

$parts = parse_url($input['link']);
$extension = pathinfo($parts['path'], PATHINFO_EXTENSION);

我还要注意您应该使用DIRECTORY_SEPARATOR作为路径。