微信小程序多张图片上传

微信小程序多张图片上传


做项目需求要做一个评价上传图片,这里需要做多张图片上传,需要图片一张一张的上传然后在提交数据保存。还有我写这个博客呢也是方便以后项目用到直接搬,后面项目频繁使用会进行封装组件

思路

用递归的方法,在每一张图片上传完API返回图片服务器地址,用push函数添加到新数组,以此类推上传完成保存这个新数组即可

效果图

在这里插入图片描述

实现过程

这里的样式、布局和图片显示逻辑我用的是colorUI的表单组件 colorUI github地址:https://github.com/weilanwl/ColorUI

1.页面布局
view

 <view class="cu-bar bg-white margin-top">
    <view class="action">
        图片上传
    </view>
    <view class="action">
        {{imgList.length}}/4
    </view>
</view>
<view class="cu-form-group">
    <view class="grid col-4 grid-square flex-sub">
        <view class="padding-xs bg-img" style="background-image:url({{imgList[index]}})" wx:for="{{imgList}}" wx:key="{{index}}" bindtap="ViewImage" data-url="{{imgList[index]}}">
            <view class="cu-tag bg-red" catchtap="DelImg" data-index="{{index}}">
                <text class="icon-close"></text>
            </view>
        </view>
        <view class="padding-xs solids" bindtap="ChooseImage" wx:if="{{imgList.length<4}}">
            <text class="icon-cameraadd"></text>
        </view>
    </view>
</view>

2.页面逻辑
页面逻辑参考:https://www.jianshu.com/p/45f8281f45bd 感谢!
如果项目多出使用可以封装成组件方便使用,因为我只有一处使用就不封装了!

const app = getApp();
Page({
    data: {
       imgList: [],
       fileImgList: [],
    },
    onLoad: function(options) {
        
    },
    ChooseImage() {//选择图片
        wx.chooseImage({
            count: 4, //默认9
            sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album'], //从相册选择
            success: (res) => {
                if (this.data.imgList.length != 0) {
                    this.setData({
                        imgList: this.data.imgList.concat(res.tempFilePaths)
                    })
                } else {
                    this.setData({
                        imgList: res.tempFilePaths
                    })
                }
            }
        });
    },
    ViewImage(e) {//查看图片
        wx.previewImage({
            urls: this.data.imgList,
            current: e.currentTarget.dataset.url
        });
    },
    DelImg(e) {//删除图片
        this.data.imgList.splice(e.currentTarget.dataset.index, 1);
        this.setData({
            imgList: this.data.imgList
        })
    },
    Submission(e){
    	var then = this
        var imgList = then.data.imgList
		then.uploadimg({
            url: app.globalData.appUrl//API接口地址
           	path: imgList,
        });
    },
   	uploadimg: function(data) {
       var then = this,
           i = data.i ? data.i : 0,
           success = data.success ? data.success : 0,
           fail = data.fail ? data.fail : 0;

       wx.showLoading({
           title: '上传中...',
           mask: true,
       })
       wx.uploadFile({
           url: data.url,
           filePath: data.path[i],
           name: 'img',
           formData: 'null',
           success: function(res) {
               wx.hideLoading();
               success++;
               var str = res.data //返回的结果,可能不同项目结果不一样
               var pic = JSON.parse(str);
               var pic_name = pic.img;
               var fileImgList = then.data.fileImgList;
               fileImgList.push(pic_name)//上传后返回的图片地址组成新数组 提交数据时提交
           },
           fail: function(res) {
               fail++;
               console.log('fail:' + i + "fail:" + fail);
           },
           complete: function(res) {
               i++;
               if (i == data.path.length) {
               		//图片传完,则继续调用函数提交内容和图片地址数组保存
                   then.uploadForm()
               } else { //若图片还没有传完,则继续调用函数
                   data.i = i;
                   data.success = success;
                   data.fail = fail;
                   then.uploadimg(data);
               }
           },
       })
   	},

})
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Uniapp 中实现微信小程序多张图片上传,可以按照以下步骤进行操作: 1. 在页面中创建一个按钮,用于触发选择图片的操作。 2. 在按钮的点击事件中,调用 `uni.chooseImage` 方法来选择图片。这个方法会返回选择的图片的临时文件路径。 3. 将选择的图片路径保存在一个数组中。 4. 在页面中展示已选择的图片,可以使用 `v-for` 指令来遍历已选择的图片数组,使用 `uni.previewImage` 方法来预览图片。 5. 创建一个提交按钮,在点击事件中调用 `uni.uploadFile` 方法,将选择的图片上传到服务器。 下面是一个示例代码: ```html <template> <view> <button @tap="chooseImage">选择图片</button> <view v-for="(image, index) in imageList" :key="index"> <image :src="image" mode="aspectFit" @tap="previewImage(index)" /> </view> <button @tap="uploadImages">上传图片</button> </view> </template> <script> export default { data() { return { imageList: [], // 存放已选择的图片路径 }; }, methods: { chooseImage() { uni.chooseImage({ count: 9, // 最多可以选择的图片张数 success: (res) => { // 将选择的图片路径保存到 imageList 数组中 this.imageList = res.tempFilePaths; }, }); }, previewImage(index) { uni.previewImage({ urls: this.imageList, // 需要预览的图片路径列表 current: this.imageList[index], // 当前显示的图片链接 }); }, uploadImages() { // 遍历已选择的图片路径,逐个上传 this.imageList.forEach((image) => { uni.uploadFile({ url: 'https://your-upload-api-url', // 上传图片的接口地址 filePath: image, name: 'file', // 上传文件对应的 key 值 formData: {}, // 其他额外的参数 success: (res) => { console.log(res.data); }, }); }); }, }, }; </script> ``` 请注意替换示例代码中的上传接口地址为你自己的接口地址。另外,需要在 `manifest.json` 文件中添加相应的权限配置,以允许选择图片和上传文件。 希望这个示例对你有帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值