Laravel行为异常 - 显示错误的图片
Laravel行为异常 - 显示错误的图片
我有一个网站satoshirps.site
当一个新用户注册时,他的个人资料照片保持为空。
然后转到上传图片以上传个人资料照片。
返回仪表板(www.satoshirps.site/dashboard)后,用户会看到他上传的个人资料照片。现在转到删除图片以删除当前的个人资料照片,然后使用上传功能上传另一张个人资料照片。
这次返回仪表板显示旧的照片(这很奇怪)。
当我尝试这个功能时,我成功地第二次上传了图片(我在我的应用程序文件夹中检查了文件)。然后我没有得到正确的图片。是lavarel有缓存或者这是一个cookie问题。我尝试了删除浏览器的缓存和cookie,但是没有任何作用。
上传页面:
上传 @if(Session::has('success')) {{ Session::get('success') }} @endif @if(Session::has('error')) {{ Session::get('error') }} @endif {{ Form::open(array('url' => 'upload', 'files' => true, 'method' => 'post')) }} {!! csrf_field() !!} {{ Form::file('image') }} {{ Form::submit('上传') }} {{ Form::close() }}
控制器:
middleware('auth'); } /** * 显示应用程序仪表板。 * * @return \Illuminate\Http\Response */ public function index() { return view('home'); } public function dashboard() { $user = Auth::user(); return view('dashboard', compact('user')); } public function upload() { $user = Auth::user(); return view('upload', compact('user')); } public function uploadsave(Request $request) { $user = Auth::user(); if (Input::file('image')->isValid()) { $filename = 'profilepics/'.$user->username.'.jpg'; File::delete($filename); $img = Image::make($_FILES['image']['tmp_name'])->encode('jpg',75)->resize(200,200)->save('profilepics/'.$user->username.'.jpg'); $dbuser = User::where('id', $user->id)->first(); $dbuser->photo_path = '/profilepics/'.$user->username.'.jpg'; $dbuser->save(); //更新用户的个人资料照片位置 Session::flash('success', '上传成功'); return Redirect::to('upload'); } else { // 返回带有错误消息的页面。 Session::flash('error', '上传的文件无效'); return Redirect::to('upload'); } } public function deletephoto() { $user = Auth::user(); $filename = 'profilepics/'.$user->username.'.jpg'; File::delete($filename); if (file_exists($filename)) { echo "图片未被删除"; } else { echo "图片已被删除"; } } }
路由文件:
'web'], function () { Route::auth(); Route::get('/home', 'HomeController@index'); Route::get('/dashboard', 'HomeController@dashboard'); Route::get('/upload', 'HomeController@upload'); Route::post('/upload', 'HomeController@uploadsave'); Route::get('delete', 'HomeController@deletephoto'); });
此外,如果您在删除文件后访问仪表板,您将看到您的旧个人资料照片。
请有人试一试并帮助我。
Laravel behaving madly - showing wrong images
问题原因:Laravel框架中出现了显示错误图片的问题。问题的根本原因是在删除文件时使用了错误的路径,导致无法删除目标文件。
解决方法:将图片保存在storage目录中,并通过创建路由来提供图片服务。在UsersController中创建如下路由:
public function profilePicture($user){ $profile_picture_url = storage_path().'/profile_pictures/'.$user['id'].'/profile.jpg'; if(!File::exists( $profile_picture_url )) App::abort(404); return Image::make($profile_picture_url)->response('jpg'); }
然后,在视图中使用Laravel的HTML和URL助手创建img标签:
HTML::image(URL::action('UsersController', array($user['id'])))
确保已安装Intervention扩展包,并按照文档进行配置。
问题可能是由于删除文件时使用了错误的路径,默认情况下,Storage::delete($filename)将从App\storage\app\public\profilepics目录中删除文件,而实际图片是存储在App\public\profilepics目录中。
在配置部分的文档中有明确说明,请仔细阅读完整的文档。
还可以尝试将图片保存在storage文件夹中,但是会遇到如何检索图片的另一个问题,因为Storage只会返回存储的图像内容,而不是文件名。
尝试通过更改config/filesystem.php中的存储路径来解决问题,但是都没有生效。
可以通过创建一个路由来解决该问题。可以查看这个链接中的代码示例:stackoverflow.com/questions/36066144/…
关于如何将URL或图片传递给视图(dashboard),可以使用内置的URL构建器URL::action('Controller', array($params))。
如果遇到类似于"Action App\Http\Controllers\HomeController not defined. (View: /home/yash/website/resources/views/dashboard.blade.php)"的错误,可以通过在路由文件中包含profilePicture来解决。
如果在dashboard页面看到空白图片,并且查看图片源码时发现类似于""的错误链接,应该将其更正为""。
问题的解决方法可能与使用的Laravel版本有关,可以参考这个链接:laravel.com/docs/5.2/helpers#method-action
以上是通过聊天继续讨论解决问题的过程,具体可以参考这个链接:chat.stackoverflow.com/rooms/106747/discussion-between-clod986-and-yash-lotan。