如何在Laravel 5中使用Intervention Image上传大尺寸图片

3
我在我的项目中使用Image Intervention
当我上传小尺寸的图片时,我的应用程序可以正常工作。但是当我试图上传大文件(>2MB)时,我的应用程序停止了工作!
即使没有显示适当的错误信息。有时会显示Token mismatch错误,有时URL无法重定向。
如何解决?我没有头绪。
这是我的代码:
$post->new Post();

if($request->hasFile('image')){
    $image=$request->file('image');
    $filename=Auth::user()->id.'_'.time().'.'.$image->getClientOriginalExtension();
    $location=public_path('images/'.$filename);
    Image::make($image)->save($location);

    $post->image=$filename;
}

$post->save();

我正在使用Image intervention来上传图片。但您也可以建议其它替代方式。
谢谢!
2个回答

3

实际上,这个问题是由服务器端将变量值设置到php.ini文件中引起的。如果您上传的内容超过了服务器的post_max_size设置,输入将会为空,您将收到Token mismatch错误提示。

根据您的需要更改upload_max_filesizepost_max_size的值,并重新启动服务器即可解决此问题。


1
我已经更改了upload_max_filesize=100Mpost_max_size=20M并重新启动了服务器。之后,我尝试上传一个jpeg图像(4.04M)。现在没有显示任何错误,但是当我提交表单时,会出现一个空白页面,最终图片也无法上传。你能解释一下吗? - S M Iftakhairul
希望您在打开调试模式的情况下进行检查。同时请查看ini.memory limitini.upload-max-filesize。希望这能对您有所帮助。 - AddWeb Solution Pvt Ltd
遇到了完全相同的错误(大文件图像上传时令牌不匹配),并更改了答案中提到的两个ini设置。这成功地解决了问题。谢谢@AddWeb - Watercayman

0
原来这是一个内存问题。如果您检查错误日志,就会发现服务器内存不足。您将看到类似以下的内容。
PHP Fatal error:  Allowed memory size of XXXXXXXX bytes exhausted (tried to allocate XXXXX bytes) in ...

由于Intervention Image逐像素读取整个图像并将数据保存在内存中,因此看似小的2MB图像最终可能需要数十MB的内存来处理。

您可能需要将内存限制设置为最高可用值,并在打开文件之前检查文件大小,因为没有错误消息的网站会让人感到尴尬。可以使用类似以下的代码:

if( $request->hasFile('image') && $request->file('image')->getClientSize() < 2097152 ){
    $image=$request->file('image');
    $filename=Auth::user()->id.'_'.time().'.'.$image->getClientOriginalExtension();
    $location=public_path('images/'.$filename);
    Image::make($image)->save($location);

    $post->image=$filename;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接