干预图片:不支持编码格式(png?v=73d79a89bded&a)
Intervention Image: Encoding format (png?v=73d79a89bded&a) is not supported
我正在使用 Laravel 5
Embed package to grab the meta data of external links. I then use Intervention Image 包来处理 link 的默认图像并将其保存在磁盘上。
一切正常,直到我尝试提交 link 到 Whosebug
问题。然后我得到这个 error:
NotSupportedException in AbstractEncoder.php line 149:
Encoding format (png?v=73d79a89bded&a) is not supported.
in AbstractEncoder.php line 149
at AbstractEncoder->process(object(Image), 'png?v=73d79a89bded&a', null) > in AbstractDriver.php line 77
at AbstractDriver->encode(object(Image), 'png?v=73d79a89bded&a', null) in > Image.php line 119
at Image->encode('png?v=73d79a89bded&a', null) in Image.php line 139
at Image->save('C:\xampp\htdocs\r2\public/images/rwSuGpEB.png?v=73d79a89bded&a') in PostsController.php line 70
如何在 Laravel
和干预包中处理此问题?
如何从 basename()
中删除 ?v=73d79a89bded&a
?
这是PostsController
中的create()
方法
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');
}
如果你的图片名称末尾有一个查询字符串?v=73d79a89bded&a
。该查询字符串被错误地解释为图像文件扩展名的一部分。
在进一步处理之前删除该查询字符串。
更新
假设 $extension 包含不需要的查询字符串
$orig = pathinfo($info->image, PATHINFO_EXTENSION);
$extension = substr($orig, 0, strpos($orig, '?'));
您似乎正在接受 URL,因此您应该先使用 parse_url:
$parts = parse_url($input['link']);
$extension = pathinfo($parts['path'], PATHINFO_EXTENSION);
我还会注意到您可能应该使用 DIRECTORY_SEPARATOR
作为路径。
我正在使用 Laravel 5
Embed package to grab the meta data of external links. I then use Intervention Image 包来处理 link 的默认图像并将其保存在磁盘上。
一切正常,直到我尝试提交 link 到 Whosebug
问题。然后我得到这个 error:
NotSupportedException in AbstractEncoder.php line 149:
Encoding format (png?v=73d79a89bded&a) is not supported.
in AbstractEncoder.php line 149
at AbstractEncoder->process(object(Image), 'png?v=73d79a89bded&a', null) > in AbstractDriver.php line 77
at AbstractDriver->encode(object(Image), 'png?v=73d79a89bded&a', null) in > Image.php line 119
at Image->encode('png?v=73d79a89bded&a', null) in Image.php line 139
at Image->save('C:\xampp\htdocs\r2\public/images/rwSuGpEB.png?v=73d79a89bded&a') in PostsController.php line 70
如何在 Laravel
和干预包中处理此问题?
如何从 basename()
中删除 ?v=73d79a89bded&a
?
这是PostsController
create()
方法
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');
}
如果你的图片名称末尾有一个查询字符串?v=73d79a89bded&a
。该查询字符串被错误地解释为图像文件扩展名的一部分。
在进一步处理之前删除该查询字符串。
更新
假设 $extension 包含不需要的查询字符串
$orig = pathinfo($info->image, PATHINFO_EXTENSION);
$extension = substr($orig, 0, strpos($orig, '?'));
您似乎正在接受 URL,因此您应该先使用 parse_url:
$parts = parse_url($input['link']);
$extension = pathinfo($parts['path'], PATHINFO_EXTENSION);
我还会注意到您可能应该使用 DIRECTORY_SEPARATOR
作为路径。