微信小程序多图上传及后台处理(后台用thinkphp3.2)

 

 index.wxml页面

 1 <view class="info">
 2     <form bindsubmit="save">
 3     <view class="info-list">
 4         <view class="list-left">店铺logo<text></text></view>
 5         <view class="list-right">
 6             <image src="{{store_logo?store_logo:'/images/add.png'}}" style=" 128rpx;height: 128rpx;" bindtap="uploadLogo"></image>
 7         </view>
 8     </view>
 9     <view class="info-list">
10         <view class="list-left">店铺名称<text>*</text></view>
11         <view class="list-right">
12             <input placeholder="请输入店铺名称" name="store_name" value="{{store_info.store_name}}"></input>
13         </view>
14     </view>
15     <view class="info-list">
16         <view class="list-left">店铺地址<text>*</text></view>
17         <view class="list-right">
18             <picker bindchange="bindPadChange" value="{{index}}" range="{{position_list}}" class="picker" style="margin-left: 10rpx;">
19                 <view class="picker" class="input-item">
20                     {{position_list[index]}}
21                 </view>
22             </picker>
23         </view>
24     </view>
25         <view class="info-list">
26         <view class="list-left">店铺铺号<text>*</text></view>
27         <view class="list-right">
28             <input placeholder="请输入店铺铺号" name="store_num" value="{{store_info.store_num}}"></input>
29         </view>
30     </view>
31     <view class="info-list">
32         <view class="list-left">联系人<text>*</text></view>
33         <view class="list-right">
34             <input placeholder="请输入联系人" name="link_name" value="{{store_info.link_name}}"></input>
35         </view>
36     </view>
37     <view class="info-list">
38         <view class="list-left">联系方式<text>*</text></view>
39         <view class="list-right">
40             <input placeholder="请输入联系方式" name="link_tel" value="{{store_info.link_tel}}"></input>
41         </view>
42     </view>
43     <view class="info-list list1">
44         <view class="list-left">主营品牌及产品<text>*</text></view>
45     </view>
46     <view class="field">
47         <textarea name="major_brand" value="{{store_info.major_brand}}" placeholder="请认真填写主营的品牌及产品,内容会在店铺头部显示" placeholder-class="font-size:24rpx"></textarea>
48     </view>
49 
50     <view class="list1" style="border-top: 1px solid #ddd;">
51         <view class="list-left">店铺照片:<text>(可以上传三张店铺图片) </text></view>
52         <button class="Btn" type="file" accept="image/jpg,image/jpeg,image/png,image/gif" multiple="" bindtap='uploader' name="images">上传图片</button>
53         <view class="goods-print">
54             <view class="print-view" wx:for="{{imagesList}}">
55                 <image src="{{item}}"></image>
56                 <view class="detail" bindtap="delImg" data-index="{{index}}">×</view>
57             </view>
58         </view>
59     </view>
60 
61     <view class="releaseBtn">
62         <view class="redColor">带*号店铺属性为必填项</view>
63         <button formType="submit">提交</button>
64     </view>
65     </form>
66 </view>

index.wxss页面

page{
  background-color: #fff;
}
.info-list{
  width: 100%;
  display: flex;
flex-direction: row;
padding:28rpx;
border-bottom: 1px solid #ddd;
color: #000000;

}
.list-right{
  width: 500rpx;
}
.list-left text{
  color: red;
}
.list-right .radio{
  padding-right: 30rpx;
}
.list1{
  border-bottom: none;
  color: #000;
  padding:28rpx;
}
.list-right text{
  color: #999;
}
.goods-print {
display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  clear: both;
  margin-top: 20rpx;
}
.goods-print .print-view{
  width:230rpx ;
  height: 230rpx;
  position: relative;
}
.goods-print .print-view .detail{
  position: absolute;
  width: 30rpx;
  height: 30rpx;
  text-align: center;
  line-height: 30rpx;
  background-color: red;
  color: #fff;
  border-radius: 50%;
  top:0;
  right: 0;
}
.goods-print image {
  width: 220rpx;
  height: 220rpx;
}
.Btn{
  width: 200rpx;
  background-color: #09bb07;
  margin:20rpx 0 ;
  float: left;
  color: #fff;
}
.releaseBtn{
  margin:20rpx 0 100rpx 0 ;
  text-align: center;
}
.releaseBtn .redColor{
  color: red;
  font-size: 24rpx;
}
.releaseBtn button{
  width: 80%;
  background-color: #ff5d37;
  color: #fff;
  margin-top: 20rpx;
}
.field textarea{
  width: 680rpx;
  margin:0 28rpx 28rpx 28rpx;
  border-radius: 8rpx;
  border: 1px solid #ddd;
  padding:28rpx;
}
.list1{
  border:none;
}
View Code

index.js代码

  1 var server = require('../../utils/server');
  2 var app = getApp();
  3 const API_URL = app.globalData.API_URL;
  4 Page({
  5 
  6   data: {
  7     position_list: [], //位置列表
  8     position_id: [], //位置id列表
  9     index: 0,
 10     store_info: {},
 11     store_logo: '',
 12     up_logo: '',
 13     imagesList: [],
 14   },
 15   onLoad: function (options) {
 16     
 17   },
 18   // 产品类型
 19   bindPadChange: function (e) {
 20     this.setData({
 21       index: e.detail.value,
 22     })
 23   },
 24   delImg: function (e) {
 25     var img_index = e.target.dataset.index;
 26     var imgs = this.data.imagesList;
 27 
 28     server.getJSON("/Home/delStoreImg",{img_url:imgs[img_index]},  function (res) {
 29       console.log('删除图片:',res);
 30     });
 31 
 32     imgs.forEach((item, index) => {
 33       if (index == img_index) {
 34         imgs.splice(index, 1);
 35       }
 36     });
 37     this.setData({
 38       imagesList: imgs,
 39     })
 40     console.log('删除后的图片合集', this.data.imagesList);
 41   },
 42   uploader: function () {
 43     var that = this;
 44     let imagesList = [];
 45     let maxSize = 1024 * 1024;
 46     let maxLength = 3;
 47     let flag = true;
 48     wx.chooseImage({
 49       count: 3, //最多可以选择的图片总数
 50       sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
 51       sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
 52       success: function (res) {
 53         wx.showToast({
 54           title: '正在上传...',
 55           icon: 'loading',
 56           mask: true,
 57           duration: 500
 58         })
 59         for (let i = 0; i < res.tempFiles.length; i++) {
 60           if (res.tempFiles[i].size > maxSize) {
 61             flag = false;
 62             wx.showModal({
 63               content: '图片太大,不允许上传',
 64               showCancel: false,
 65               success: function (res) {
 66                 if (res.confirm) {
 67                   console.log('用户点击确定')
 68                 }
 69               }
 70             });
 71           }
 72         }
 73         if (res.tempFiles.length > maxLength) {
 74           wx.showModal({
 75             content: '最多能上传' + maxLength + '张图片',
 76             showCancel: false,
 77             success: function (res) {
 78               if (res.confirm) {
 79                 console.log('确定');
 80               }
 81             }
 82           })
 83         }
 84         if (flag == true && res.tempFiles.length <= maxLength) {
 85           that.data.imagesList = that.data.imagesList.concat(res.tempFilePaths);
 86           that.setData({
 87             // imagesList: res.tempFilePaths
 88             imagesList: that.data.imagesList
 89           })
 90         }
 91         console.log('上传图片合集', that.data.imagesList);
 92       },
 93       fail: function (res) {
 94         console.log('上传失败结果:', res);
 95       }
 96     })
 97   },
 98   uploadLogo: function () {
 99     var that = this;
100     let maxSize = 1024 * 1024;
101     let flag = true;
102     wx.chooseImage({
103       count: 1, //最多可以选择的图片总数
104       sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
105       sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
106       success: function (res) {
107         wx.showToast({
108           title: '正在上传...',
109           icon: 'loading',
110           mask: true,
111           duration: 500
112         })
113         if (res.tempFiles[0].size > maxSize) {
114           flag = false;
115           wx.showModal({
116             content: '图片太大,不允许上传',
117             showCancel: false,
118             success: function (res) {
119               if (res.confirm) {
120                 console.log('用户点击确定')
121               }
122             }
123           });
124         }
125         if (flag == true) {
126           wx.uploadFile({
127             url: API_URL + '/Home/uploadStoreImg',
128             filePath: res.tempFiles[0].path,
129             name: 'uploadfile_ant',
130             header: {
131               "Content-Type": "multipart/form-data"
132             },
133             formData: {
134               type: 1,
135               id: 0,
136             },
137             success: function (result) {
138               var e = JSON.parse(result.data);
139               that.setData({
140                 store_logo: e.img_url,
141                 up_logo: e.result
142               })
143             },
144             fail: function (data) {
145               console.log(data);
146             }
147           });
148         }
149         console.log('店铺logo', that.data.store_logo);
150       },
151       fail: function (res) {
152         console.log('上传失败结果:', res);
153       }
154     })
155   },
156   // 保存
157   save(event) {
158     let self = this,
159       eventDA = event.detail.value;
160     
161     if (eventDA.store_name.length <= 0) {
162       wx.showToast({
163         title: '请输入店铺名称',
164         icon: 'none',
165         duration: 1000
166       });
167       return false;
168     }
169     if (eventDA.store_num.length <= 0) {
170       wx.showToast({
171         title: '请输入店铺铺号',
172         icon: 'none',
173         duration: 1000
174       });
175       return false;
176     }
177     if (self.data.index == 0) {
178       wx.showToast({
179         title: '请选择店铺地址',
180         icon: 'none',
181         duration: 1000
182       });
183       return false;
184     }
185     if (eventDA.link_name.length <= 0) {
186       wx.showToast({
187         title: '请输入联系人',
188         icon: 'none',
189         duration: 1000
190       });
191       return false;
192     }
193     if (eventDA.link_tel.length <= 0) {
194       wx.showToast({
195         title: '请输入联系方式',
196         icon: 'none',
197         duration: 1000
198       });
199       return false;
200     }
201     if (eventDA.major_brand.length <= 0) {
202       wx.showToast({
203         title: '请填写主营的品牌及产品',
204         icon: 'none',
205         duration: 1000
206       });
207       return false;
208     }
209     var user_id = wx.getStorageSync("user").user_id;
210     if(!self.data.store_info || self.data.store_info.length <= 0){
211       var store_id = 0;
212     }else{
213       var store_id = self.data.store_info.store_id;
214     }
215 
216     server.postJSON('/Home/edit_info/',{
217       store_id:store_id,
218       user_id:user_id,
219       position_id1:self.data.position_id[self.data.index],
220       store_name:eventDA.store_name,
221       store_num:eventDA.store_num,
222       link_name:eventDA.link_name,
223       link_tel:eventDA.link_tel,
224       major_brand:eventDA.major_brand,
225       store_logo:self.data.up_logo,
226     },function(res){
227       if(res.data.status == 1){
228         if(store_id > 0){
229           var id = store_id;
230         }else{
231           var id = res.data.list;
232         }
233         if (self.data.imagesList.length > 0) {
234           console.log('图片合集:', self.data.imagesList);
235           for (let i = 0; i < self.data.imagesList.length; i++) {
236             if (self.data.imagesList[i].indexOf("tmp") > 0) {
237               wx.uploadFile({
238                 url: API_URL + '/Home/uploadStoreImg',
239                 filePath: self.data.imagesList[i],
240                 name: 'uploadfile_ant',
241                 header: {
242                   "Content-Type": "multipart/form-data"
243                 },
244                 formData: {
245                   type: 2,
246                   id: id,
247                 },
248                 success: function (data) {
249                   if ((self.data.imagesList.length - 1) == i) {
250 
251 
252                   }
253                 },
254                 fail: function (data) {
255                   console.log(data);
256                 }
257               });
258             }
259           }
260         }
261 
262         wx.showToast({
263           title: '保存成功',
264           duration: 1000
265         });
266         setTimeout(function () {
267           wx.redirectTo({
268             url: '/pages/member/index/index'
269           });
270         }, 1000);
271       }else{
272         var msg = res.data.msg;
273         wx.showToast({
274           title: '' + msg,
275           icon: 'none',
276           duration: 1000
277         });
278       }
279     });
280   }
281 })

后台处理图片上传代码:

 1 <?php
 2 
 3 namespace WXAPIController;
 4 
 5 use ThinkController;
 6 
 7 class HomeController extends BaseController
 8 {
 9 
10     /**
11      * 析构流函数
12      */
13     public function __construct()
14     {
15         parent::__construct();
16 
17     }
18     /**
19      * 上传店铺图片
20      */
21     public function uploadStoreImg()
22     {
23         $store_id = I('id', 0);
24         $type = I('type', 1);
25         $path = "Public/upload/store/";
26         $path .= date('Y') . "/" . date('m-d') . "/";
27         if (!is_dir($path)) { //判断目录是否存在 不存在就创建
28             mkdir($path, 0777, true);
29         }
30 
31         $allow = ["image/jpg", "image/jpeg", "image/bmp", "image/png",];
32         if ($_FILES["uploadfile_ant"]["error"] > 0) {
33             exit(json_encode(array('status' => -1, 'msg' => '上传失败,错误码:' . $_FILES["uploadfile_ant"]['error'], 'result' => '')));
34         }
35 
36         if (!in_array($_FILES["uploadfile_ant"]["type"], $allow)) {
37             exit(json_encode(array('status' => -1, 'msg' => '上传的文件类型不被允许', 'result' => '')));
38         }
39 
40         if ($_FILES['uploadfile_ant']['size'] > 5 * 1024 * 1024) {
41             exit(json_encode(array('status' => -1, 'msg' => '上传文件过大', 'result' => '')));
42         }
43         $imageName = date("YmdHis", time()) . rand(1111, 9999) . ".jpg";
44         $filepath = $path . $imageName;
45 
46         if (move_uploaded_file($_FILES['uploadfile_ant']['tmp_name'], $filepath)) {
47             $data['store_id'] = $store_id;
48             $data['img_url']  = "/" . $filepath;
49 
50             if ($type == 1) {
51                 exit(json_encode(array('status' => 1, 'msg' => '上传成功', "result" => "/" . $filepath,'img_url'=>SITE_URL."/" . $filepath)));
52             } else {
53                 $res = M('store_images')->add($data);
54                 exit(json_encode(array('status' => 1, 'msg' => '上传成功', "result" => $res)));
55             }
56             
57         }
58         exit(json_encode(array('status' => 1, 'msg' => '上传成功', "result" => "/" . $filepath,'img_url'=>SITE_URL."/" . $filepath)));
59     }
60     /**
61      * 删除店铺图片
62      */
63     public function delStoreImg()
64     {
65         $img_url = I('img_url', '');
66         $type = I('type', 1);
67         
68         if($img_url){
69             $img_arr = explode(SITE_URL,$img_url);
70             $img_info = M('store_images')->where(array('img_url'=>$img_arr[1]))->find();
71             if($img_info){
72                 unlink($_SERVER['DOCUMENT_ROOT'].$img_arr[1]);
73                 M('store_images')->where(array('img_url'=>$img_arr[1]))->delete();
74             }
75             exit(json_encode(array('status' => 1, 'msg' => '删除成功', "result" => '')));
76         }
77     }
78 }
原文地址:https://www.cnblogs.com/Jessie-candy/p/13576882.html