一.介绍
我们知道多图上传一般都附带的又即时显示功能,即上传后可以立刻看到所传图片。之前一直用的一个多图上传插件是选择图片,点击上传然后图片资源上传到服务器,然后返回存储的路径信息,最后我们点击表单的提交按钮后将这些信息插入数据库。
现在有一个尴尬的地方,当我点击上传图片后,我又取消这次表单提交了。可是图片资源已经到服务器了,容易造成空间浪费等。
现在提供一个自己结合Laravel框架写的多图上传,(当然,在任何地方都可以直接套用),特点是:图片上传后可即时显示,但是是通过blob调用的浏览器缓存图片信息,当表单提交后,图片资源才会真正的上传服务器与数据库。
二.前端
注:本例基于Laravel框架
先上Form表单
1
2
3
4
5
6
7
8
|
<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代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
<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; //将图片转换成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); } } } //点击提交按钮触发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(实际获取的是缓存中的图片路径信息,用于即时显示,并非服务器返回的实际资源路径) 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> |
三.后台处理代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public function store(Request $request ) { $data = $request ->all(); $imgs = $data [ 'imgs' ]; // array_values()用于重置数组下标 $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 ); //插入数据库 $img = new Img; $filepath = strchr ( $filepath , '/' ); $img ->img_path= $filepath ; $img ->save(); } |
原文链接:http://blog.csdn.net/gu_wen_jie/article/details/77964789
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容