摘要:在編寫程序的過程中,經常會遇到一個經典的文件上傳場景上傳頭像圖片?;趯ψ詈玫挠脩趔w驗的追求,寫一下之前在項目中實現在項目中的上傳頭像。
在編寫web程序的過程中,經常會遇到一個經典的文件上傳場景:上傳頭像(圖片)。基于對最好的用戶體驗的追求,寫一下之前在項目中實現在Laravel項目中的Ajax上傳頭像。
1.配置路由在Laravel的routes.php中設置路由:
Route::get("/avatar/upload","UsersController@avatar"); Route::post("/avatar/upload","UsersController@avatarUpload");2.配置控制器
在UsersController.php中增加對應的avatar和avatarUpload這兩個方法,前者用來渲染視圖,后者處理實際上傳的圖像文件。
public function avatar() { return view("users.avatar"); } public function avatarUpload() { //some codes to deal with upload avatar }3.編寫前端代碼
這其實就是在對應的users/文件夾的avatar.blade.php視圖文件中設置樣式,以下的HTML的各個標簽可以根據自己的情況設置class和id:
< div class="avatar-upload" id="avatar-upload"> {!! Form::open( [ "url" => ["/avatar/upload/api"], "method" => "POST", "id" => "upload", "files" => true ] ) !!} {!! Form::close() !!}
在js中實現Ajax請求,這里的Ajax借助了Jquery的第三方插件http://malsup.com/jquery/form/:
$(document).ready(function() { var options = { beforeSubmit: showRequest, success: showResponse, dataType: "json" }; $("#image").on("change", function(){ $("#upload-avatar").html("正在上傳..."); $("#upload").ajaxForm(options).submit(); }); }); function showRequest() { $("#validation-errors").hide().empty(); $("#output").css("display","none"); return true; } function showResponse(response) { if(response.success == false) { var responseErrors = response.errors; $.each(responseErrors, function(index, value) { if (value.length != 0) { $("#validation-errors").append(""+ value +""); } }); $("#validation-errors").show(); } else { $("#user-avatar").attr("src",response.avatar); } } 4.處理上傳的圖片回到UsersController.php中的avatarUpload方法,現在就可以處理上傳上來的圖片了:
public function avatar() { $this->wrongTokenAjax(); $file = Input::file("image"); $input = array("image" => $file); $rules = array( "image" => "image" ); $validator = Validator::make($input, $rules); if ( $validator->fails() ) { return Response::json([ "success" => false, "errors" => $validator->getMessageBag()->toArray() ]); } $destinationPath = "uploads/"; $filename = $file->getClientOriginalName(); $file->move($destinationPath, $filename); return Response::json( [ "success" => true, "avatar" => asset($destinationPath.$filename), ] ); } }注:在上傳之前,確認在laravel的public/目錄下創建了uploads/文件夾,并給以相應的權限,如:
sudo chmod -R 777 uploads/在上面的avatarUpload方法中,有一個wrongTokenAjax方法,這是用來檢驗Laravel體系的token值的,同樣是在UsersController.php中添加:
public function wrongTokenAjax() { if ( Session::token() !== Request::get("_token") ) { $response = [ "status" => false, "errors" => "Wrong Token", ]; return Response::json($response); } }5.最后到這里一個簡單的Ajax上傳圖片的demo就完成了,在實際的開發中,我們還需要考慮以下幾個問題:
根據用戶的不同用戶名或者用戶id來創建不同的文件夾,這些都可以在avatarUpload方法中 $file->move($destinationPath, $filename)之前使用
File::exists($username) or File::makeDirectory($username);
更新數據庫中用戶的avatar字段,大概是這樣的:在avatarUpload方法返回數據之前,使用下面的類似語句:
$user->avatar = your_avtar_upload_path; $user->save();
如果你還想更進一步改善體驗,提供一些圖片的裁剪和添加濾鏡等功能,可以同時使用 Intervention/Image php包和Jcrop js圖片裁剪實現,比如在:
function showResponse(response) { }中,如果成功的返回圖片,就在$("#user-avatar").attr("src",response.avatar)后執行:
$("#user-avatar").Jcrop({ aspectRatio: 1, onSelect: updateCoords, setSelect: [120,120,10,10] });就可以在前端實現圖片裁剪,然后將相應的裁剪數據如裁剪圖片的height,width,x-align.y-align等傳到后端處理就可以,使用Intervention/Image的話,在后端處理圖片就是輕而易舉的事情了!
Happy Hacking
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21007.html
相關文章
在 JS 中實現 Laravel 的 route 函數
摘要:所以推薦給每個路由都命個名,并通過路由名的方式來獲取。所以我就考慮能不能在中實現一個類似后端的函數。最終的解決方案很簡單,兩個函數就可以搞定。 在Laravel的路由模塊里,我們可以給每一個路由設定一個名字,比如: Route::get(/blog/{blog}, BlogController@show)->name(blog.show); 然后就可以通過 route(blog.sho...
laravel-admin 文件上傳OSS
摘要:前言因為項目需求,需要把圖片上傳至阿里云,我的接口和后臺項目是分開的,都使用的框架開發,接入這里就不做討論了,這里主要說一下上傳阿里的問題。 前言 因為項目需求,需要把圖片上傳至阿里云 OSS,我的 Api 接口和后臺項目是分開的,都使用的 laravel 框架開發,Api 接入 OSS 這里就不做討論了,這里主要說一下 laravel-admin 上傳阿里 OSS 的問題。 網上的一...
node簡單實現一個更改頭像功能
摘要:前言一直想寫這篇文章,無奈由于要考試的原因,一直在復習,拖延到現在才寫,之前用的框架寫了個小項目,里面有個上傳圖片的功能,這里記錄一下如何實現我使用的是思路首先,當用戶點擊上傳頭像,更新頭像的時候,將頭像上傳到項目的一個文件夾里面我是存放在 前言 一直想寫這篇文章,無奈由于要考試的原因,一直在復習,拖延到現在才寫?,之前用 node 的 express 框架寫了個小項目,里面有個上傳圖...
發表評論
0條評論
閱讀 1459·2021-09-30 09:57
閱讀 1466·2021-09-09 09:33
閱讀 2220·2021-09-04 16:40
閱讀 1792·2021-09-01 10:50
閱讀 3237·2021-09-01 10:31
閱讀 2539·2019-08-30 15:56
閱讀 2970·2019-08-30 15:44
閱讀 3475·2019-08-29 17:29