Laravel框架+Blob實現(xiàn)的多圖上傳功能示例
本文實例講述了Laravel框架+Blob實現(xiàn)的多圖上傳功能。分享給大家供大家參考,具體如下:
一.介紹
我們知道多圖上傳一般都附帶的又即時顯示功能,即上傳后可以立刻看到所傳圖片。之前一直用的一個多圖上傳插件是選擇圖片,點擊上傳然后圖片資源上傳到服務(wù)器,然后返回存儲的路徑信息,最后我們點擊表單的提交按鈕后將這些信息插入數(shù)據(jù)庫。
現(xiàn)在有一個尷尬的地方,當(dāng)我點擊上傳圖片后,我又取消這次表單提交了??墒菆D片資源已經(jīng)到服務(wù)器了,容易造成空間浪費(fèi)等。
現(xiàn)在提供一個自己結(jié)合Laravel框架寫的多圖上傳,(當(dāng)然,在任何地方都可以直接套用),特點是:圖片上傳后可即時顯示,但是是通過blob調(diào)用的瀏覽器緩存圖片信息,當(dāng)表單提交后,圖片資源才會真正的上傳服務(wù)器與數(shù)據(jù)庫。
二.前端
注:本例基于Laravel框架
先上Form表單
<form method="post" enctype="multipart/form-data" action="#"> {{csrf_field()}} <ul class="list_btn"> <li><img id="imgone" class="sz" width="100px" height="100px" src="" style="display: none;"></li> <li> <input type="file" id="house_img_one1" name="art_thumb" multiple="multiple" onchange="houseImgOne(this)"></li> </ul> <div class="submit">上傳</div> </form>
JS代碼
<script> var _btnId = ''; var all_urls=""; var all_types=""; function houseImgOne(_this) { var img = '<img class="sz" width="100px" height="100px" src="" >' _btnId = $(_this).attr('id'); var obj = document.getElementById("house_img_one1"); var length = obj.files.length; //多圖上傳時遍歷文件信息(可以通過object.files查看) for (var i = 0; i < length; i++) { var objUrl = getObjectURL(_this.files[i]); //圖片后綴類型拼接 all_types=all_types+_this.files[i].type; //將圖片轉(zhuǎn)換成base64自字符 var oFReader = new FileReader(); oFReader.readAsDataURL(_this.files[i]); oFReader.onload = function (oFREvent) { all_urls=all_urls+oFREvent.target.result+"&|||"; //拼接data形式base64的url }; if (objUrl) { $('.sz:last').before(img); $('.sz').eq($(".sz").length - 2).attr("src", objUrl); } } } //點擊提交按鈕觸發(fā)ajax $(".submit").click(function(){ //console.log(all_types); $.ajax({ type:"post", url:"{{url('admin/img')}}", data:{'imgs':all_urls,'types':all_types,'_token':"{{csrf_token()}}"}, dataType:"json", success:function(data){ if (data==1){ // layer插件提示,可自行選擇則 layer.msg("上傳成功", {icon: 6}); window.location.reload(); }else { alert("上傳失?。?); } } }); }); //獲取blog對象url(實際獲取的是緩存中的圖片路徑信息,用于即時顯示,并非服務(wù)器返回的實際資源路徑) function getObjectURL(file) { var url = null; if (window.createObjectURL != undefined) { url = window.createObjectURL(file); } else if (window.URL != undefined) { url = window.URL.createObjectURL(file); } else if (window.webkitURL != undefined) { url = window.webkitURL.createObjectURL(file); } return url; } </script>
三.后臺處理代碼
public function store(Request $request) { $data=$request->all(); $imgs = $data['imgs']; // array_values()用于重置數(shù)組下標(biāo) $types =array_values(array_filter(explode('image/',$data['types']))); $arr=array_values(array_filter(explode('&|||',$imgs))); foreach ($arr as $k => $v){ //文件路徑 $filepath = base_path().'/storage/app/imgs/'.date('YmdHis').$k.'.'.$types[$k]; //提取base64字符 $imgdata = substr($v,strpos($v,",") + 1); $decodedData = base64_decode($imgdata); file_put_contents($filepath,$decodedData ); //插入數(shù)據(jù)庫 $img = new Img; $filepath = strchr($filepath,'/'); $img->img_path=$filepath; $img->save(); }
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進(jìn)階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Laravel框架的PHP程序設(shè)計有所幫助。
相關(guān)文章
smarty模板中使用get、post、request、cookies、session變量的方法
這篇文章主要介紹了smarty模板中使用get、post、request、cookies、session變量的方法,需要的朋友可以參考下2014-04-04laravel admin實現(xiàn)分類樹/模型樹的示例代碼
這篇文章主要介紹了laravel admin實現(xiàn)分類樹/模型樹,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06詳解Grunt插件之LiveReload實現(xiàn)頁面自動刷新(兩種方案)
這篇文章主要通過兩種方案詳解Grunt插件之LiveReload實現(xiàn)頁面自動刷新,需要的朋友可以參考下2015-07-07Yii框架實現(xiàn)多數(shù)據(jù)庫配置和操作的方法
這篇文章主要介紹了Yii框架實現(xiàn)多數(shù)據(jù)庫配置和操作的方法,結(jié)合實例形式分析了Yii框架多數(shù)據(jù)庫的配置技巧與相關(guān)操作注意事項,需要的朋友可以參考下2017-05-05php 提速工具eAccelerator 配置參數(shù)詳解
php 提速工具eAccelerator 配置參數(shù)詳解,需要的朋友可以參考下。2010-05-05PHP CURL或file_get_contents獲取網(wǎng)頁標(biāo)題的代碼及兩者效率的穩(wěn)定性問題
PHP CURL與file_get_contents函數(shù)都可以獲取遠(yuǎn)程服務(wù)器上的文件保存到本地,但在性能上面兩者完全不在同一個級別,下面通過一個例子給大家介紹PHP CURL或file_get_contents獲取網(wǎng)頁標(biāo)題的代碼及兩者效率的穩(wěn)定性問題,需要的朋友參考下2015-11-11