批量上傳圖片(jQuery-File-Upload使用)
阿新 • • 發佈:2018-12-04
styles client lar new this thead alex pla multipl
jQuery-File-Upload
jQuery-File-Upload是一個jquery下的ajax文件上傳插件,支持批量上傳,github地址:https://github.com/blueimp/jQuery-File-Upload。
官方有個基本的使用教程,如果沒有特別需求可以參考這個簡單使用
https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin
官方的demo地址,感興趣可以對照源碼分析下,demo分別對應源碼basic-plus.html,basic.html等文件
https://blueimp.github.io/jQuery-File-Upload/
批量上傳圖片
需要引入的css和js文件
<link rel="stylesheet" href="{{asset('js/jquery-fileupload/css/jquery.fileupload.css')}}">
<link rel="stylesheet" href="{{asset('js/jquery-fileupload/css/jquery.fileupload-ui.css')}}">
<script type="text/javascript" src="{{asset('js/jquery-fileupload/js/jquery.ui.widget.js')}}"></script> <script type="text/javascript" src="{{asset('js/jquery-fileupload/js/jquery.fileupload.js')}}"></script> <script type="text/javascript" src="{{asset('js/jquery-fileupload/js/jquery.iframe-transport.js')}}"></script>
下載地址 https://github.com/blueimp/jQuery-File-Upload/releases ,下載後解壓,將上面需要的文件放入項目相應目錄。
html代碼
<meta name="csrf-token" content="{{ csrf_token() }}">
<form id="submit_form" action="{{route('work.store')}}" method="post"> {{csrf_field()}} <table class="add_tab"> <tbody> <tr> <th>圖片:<a id="start"></a></th> <td> <input id="fileupload" type="file" name="files[]" data-url="{{route('batch-upload', ['works'])}}" multiple> <input id="file_path" type="hidden" name="file_path"> </td> </tr> <tr> <th></th> <td> <div> <div id="progress" style="width:50%;float:left"> <div class="bar" style="width: 0%;height:18px;background:green;"></div> </div> <div id="upload_finish" style="display:none;float:left;margin-left:15px;height:18px;line-height:18px;">上傳完成</div> </div> <div style="clear:both"></div> <div id = "upload_list"> </div> </td> </tr> <tr> <th></th> <td> <input type="submit" value="提交"> <input type="button" class="back" onclick="history.go(-1)" value="返回"> </td> </tr> </tbody> </table> </form>
實現的js代碼
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
singleFileUploads: false,
beforeSend: function(xhr) {
$('#upload_finish').hide();
$('#progress .bar').css(
'width',
'0%'
);
xhr.setRequestHeader("X-CSRF-TOKEN", $('meta[name="csrf-token"]').attr('content'));
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .bar').css(
'width',
progress + '%'
);
if (progress == 100) {
$('#upload_finish').show();
}
},
done: function (e, data) {
var files = data.result.data
for (i in files) {
$('#upload_list').append('<img src="' + files[i]+ '" alt="" style="max-width: 350px; max-height:100px;margin:5px;">');
}
$('#file_path').val(files);
}
});
});
laravel後臺處理
Route::post('batch-upload/{dir_name}', 'CommonController@batchUpload')->name('batch-upload');
public function batchUpload(Request $request, $dir_name)
{
try{
$file_path = [];
if($request->hasFile('files')){
$files = $request->file('files');
foreach ($files as $file) {
$entension = $file->getClientOriginalExtension();
$new_name = date('YmdHis').mt_rand(10000,99999).'.'.$entension;
$file_dir = public_path().'/uploads/'.$dir_name;
$file->move($file_dir,$new_name);
$file_path[] = '/uploads/'.$dir_name.'/'.$new_name;
}
}
return $this->success($file_path);;
}catch(\Exception $e){
return $this->error('文件上傳失敗,請刷新後重試');
}
}
註意:
- 1、ajax調用的時候需要考慮csrf問題,
html中加入頭信息
<meta name="csrf-token" content="{{ csrf_token() }}">
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRF-TOKEN", $('meta[name="csrf-token"]').attr('content'));
},
- 2、一次上傳多個文件,而不是循環調用
singleFileUploads: false,
上面配置是為了一次上傳多個文件,否則的話是當你傳入多個文件的時候會循環調用你的後臺上傳api。並且我在跑官方文檔的時候發現,一次上傳n個圖片,會觸發n次add回調,並且每次回掉獲取data.files對象都是所有的n個文件,想要單獨處理每個文件很麻煩,所以我直接每次自動上傳,並且都是上傳所有選中的文件。
上傳完成後效果
批量上傳圖片(jQuery-File-Upload使用)