微信小程序uploader上传文件并提交表单数据完整案例(接口框架WebAPI)

本文详述了微信小程序使用uploader组件进行图片上传,并结合WebAPI框架提交表单数据的完整过程,包括前端组件配置、上传方法、解决上传过程中遇到的Boolean类型、数组转换问题以及后台接口调整等技巧。

写在前面的话

最近又自己在折腾微信小程序了。最新的一个功能中需要实现图片上传。幸运的是,微信小程序扩展能力中有现成的文件上传组件uploader可以使用,而不幸的是,这个组件坑实在太多了,而我又不是单纯的文件上传,还需要同步上传表单数据,因此各种坑,要么就是数据传不过去,要么就是后台取不到数据,折腾了我一天,各种尝试,终于搞定了。前后端完整用法记录一下,希望大家都能快速上手~

uploader介绍

uploader是微信小程序WeUI组件库中的一个图片上传的组件。大家可以在小程序开发文档中——扩展能力中找到相关用法。
在这里插入图片描述

这是一个集合了图片选择、上传、预览、删除的完整组件,属性定义也比较全面,可以自定义上传个数,有上传loading提醒和失败提醒,点击预览功能等,基本可以涵盖图片文件上传的所有功能要求。

用法也很简单,在json文件中加入引用后,在wxml文件中直接引入该组件就行,不需要跟自定义的那种文件上传一样,定义一堆标签和样式,方便多了。

官方文档有简单的使用案例:
1.在json中引入uploader组件
在这里插入图片描述2.在wxml中调用该组件,设置属性方法等

 <mp-uploader bindfail="uploadError" bindsuccess="uploadSuccess" select="{
    
    {selectFile}}" upload="{
    
    {uplaodFile}}" files="{
    
    {files}}" max-count="5" title="图片上传" tips="图片上传提示"></mp-uploader>

3.定义js中的上传方法

Page({
   
   
    data: {
   
   
        files: [{
   
   
            url: 'http://mmbiz.qpic.cn/mmbiz_png/VUIF3v9blLsicfV8ysC76e9fZzWgy8YJ2bQO58p43Lib8ncGXmuyibLY7O3hia8sWv25KCibQb7MbJW3Q7xibNzfRN7A/0',
        }, {
   
   
            loading: true
        }, {
   
   
            error: true
        }]
    },
    onLoad() {
   
   
        this.setData({
   
   
            selectFile: this.selectFile.bind(this),
            uplaodFile: this.uplaodFile.bind(this)
        })
    },

    selectFile(files) {
   
   
        console.log('files', files)
        // 返回false可以阻止某次文件上传
    },
    uplaodFile(files) {
   
   
        console.log('upload files', files)
        // 文件上传的函数,返回一个promise
        return new Promise((resolve, reject) => {
   
   
            setTimeout(() => {
   
   
                reject('some error')
            }, 1000)
        })
    },
    uploadError(e) {
   
   
        console.log('upload error', e.detail)
    },
    uploadSuccess(e) {
   
   
        console.log('upload success', e.detail)
    }
});

这部分代码里面其实只需要补充uplaodFile上传方法调用后台上传图片的接口,上传功能就算完整了,这算是一个可用的完整Demo。但是实际使用起来,还是需要完善一下滴。废话不多说,直接上代码~

用法与代码

小程序前端

1.如前文所说,在json中引入组件,在页面调用

 <mp-uploader bindfail="uploadError" bindsuccess="uploadSuccess" select="{
    
    {selectFile}}" upload="{
    
    {uplaodFile}}" files="{
    
    {files}}" max-count="1" title=""></mp-uploader>

因为我只需要上传一张图片,因此设置max-count等于1。
在这里插入图片描述

2.在uplaodFile中,需要调用resolve({urls})方法设置上传成功状态,否则图片会如下图所示一直显示在加载中,体验很不友好,因此先“假装”已经上传成功,等之后提交表单时再真正上传到后台。

### 实现微信小程序 `van-uploader` 文件上传 为了在微信小程序中成功使用 `van-uploader` 组件实现文件上传功能,需注意几个关键点: - **HTML 结构**:定义视图结构时应包含 `van-uploader` 组件,设置其属性以满足特定需求。例如,允许选择多个文件、设定最大数量以及指定触发读取后的回调函数。 ```html <view class="upload_pic"> <van-uploader disabled='{{disabled}}' file-list="{{ fileList }}" upload-icon='/static/images/release/increase.png' multiple max-count="6" bind:after-read="afterRead" /> </view> ``` - **JavaScript 处理逻辑**:编写处理程序用于响应用户操作事件(如选择图片),将选中的文件信息存储起来以便后续处理或展示给用户[^2]。 ```javascript Page({ data: { fileList: [], // 存储已选择的文件列表 disabled: false, }, afterRead(event) { const { file } = event.detail; if (Array.isArray(file)) { this.setData({ fileList: [...this.data.fileList, ...file] }); } else { this.setData({ fileList: [...this.data.fileList, file] }); } }, handleRemove(index) { let newList = this.data.fileList.filter((item, idx) => index !== idx); this.setData({ fileList: newList }); } }); ``` 针对可能出现的选择新图片覆盖旧有图片的问题,可以通过修改 `data` 中保存的数据结构来避免这种情况发生。具体来说,在每次调用 `afterRead()` 方法时不是简单替换整个 `fileList` 数组而是将其与现有条目合[^3]。 对于图片预览界面右上角删除按钮无响应的情况,则需要自行为该动作绑定相应的 JavaScript 函数来进行处理。上述代码片段展示了如何通过 `handleRemove()` 来移除指定索引位置上的项目。 当遇到多图上传时不执行 `wx.uploadFile` 的情况时,应该确认是否正确配置了 `multiple=true` 属性,且理解在这种模式下传递给服务器端的是一个包含所有待上传项的对象数组而非单一对象实例[^4]。 最后值得注意的一点是,虽然微信官方提供了详细的 API 文档和技术支持资源,但在实际应用过程中可能会碰到一些未预见的技术挑战。面对这些问题时保持耐心积极寻求社区帮助是非常重要的[^1]。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值