小程序wx.uploadFile异步问题

news2024/12/26 21:42:55

问题:小程序上传文件后我需要后端返回的一个值,但这个值总是在最后面导致需要这个值的方法总是报错,打印测试后发现这它是异步的。但直接使用 await来等待也不行。 

uploadImg.wxml

<view class="upload-wrap">
  <view class="list-wrap">
    <view class="item" wx:for="{{fileList}}" wx:key="index" wx:for-index="index" wx:for-item="item">
      <image class="file" src="{{item.url}}" data-url="{{item.url}}" bindtap="viewImage"></image>
      <view wx:if="{{!disabled}}" class="icon-delete" data-index="{{index}}" bindtap="delFile">
        <image class="icon-delete" src="/images/common/icon-delete.png" mode="widthFix"></image>
      </view>
    </view>
    <view wx:if="{{!disabled && fileList.length<maxCount}}" class="add-wrap" bindtap="chooseFile">
      <image class="icon-camera" src="/images/common/icon-camera.png" mode="widthFix"></image>
    </view>
  </view>
</view>

uploadImg.js

const app = getApp();
Component({
    properties: {
        pageFileList: {
            optionalTypes: [Array, String],
            value: () => {
                return []
            },
            observer: function (newValue, oldValue) {
                let list;
                if (!newValue) {
                    list = [];
                } else if (typeof newValue == 'string') {
                    list = JSON.parse(newValue);
                }
                this.setData({
                    fileList: list
                })
            }
        },
        disabled: {
            type: Boolean,
            default: false
        },
        maxSize: {
            type: Number,
            value: 5242880, // 5M
        },
        maxCount: {
            type: Number,
            value: 9,
        },
        category: {
            type: String,
            value: 'Personal', // 1:Personal,2:Article,3:Meeting
        },
        name: {
            type: String,
            value: 'Image'
        },
        // 文件类型
        fileType: {
            type: Number,
            value: 1, // 1:Image,2:Video,3:Excel,4:PDF文件
        },
    },

    data: {
        fileList: [],
    },

    methods: {
        // 选择图片
        chooseFile() {
            let choseImgCount;
            let fileListLen = this.data.fileList.length;
            let maxCount = this.data.maxCount;

            // 计算每次可上传的文件数量
            if (fileListLen == maxCount) {
                choseImgCount = 0;
            } else if (maxCount - fileListLen > 9) {
                choseImgCount = 9;
            } else {
                choseImgCount = maxCount - fileListLen;
            }

            wx.chooseImage({
                count: choseImgCount,
                sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
                sourceType: ['album', 'camera'], // 选择图片的来源
                success: (res) => {
                    // 限制最大文件体积
                    let overSizeIndex = res.tempFiles.findIndex(v => v.size > this.data.maxSize);
                    if (overSizeIndex > -1) {
                        let msg = "";
                        if (res.tempFiles.length > 1) {
                            msg = "第" + (overSizeIndex + 1) + "个文件已经超过了最大文件限制:"
                        } else {
                            msg = "该文件已经超过了最大文件限制:"
                        }
                        app.alert.show(msg + (this.data.maxSize / 1024 / 1024).toFixed(0) + "M,请重新上传~");
                        return;
                    }
                    this.uploadFile(res.tempFilePaths);
                }
            });
        },

        // 上传图片
        async uploadFile(tempFilePaths) {
            wx.showLoading({
                title: '上传中...',
                mask: true
            })
            for (let i = 0; i < tempFilePaths.length; i++) {
                await this.uploadFileHandler(tempFilePaths, i);
                if (i == tempFilePaths.length - 1) {
                    this.triggerEvent("uploadFiles", { list: this.data.fileList, name: this.data.name });
                    wx.showToast({
                        title: '上传成功',
                        icon: 'none',
                        duration,
                    })
                }
            }
        },

        uploadFileHandler(tempFilePaths, i) {
            let self = this;
            let fileList = self.data.fileList;
            return new Promise((resolve, reject) => {
                wx.uploadFile({
                    url: app.siteinfo.apiUrl + '', // 需要用HTTPS,同时在微信公众平台后台添加服务器地址
                    filePath: tempFilePaths[i], // 上传的文件本地地址
                    name: 'file', // 服务器定义的Key值
                    header: {
                        'content-type': 'multipart/form-data',
                        'cookie': wx.getStorageSync('cookie')
                    },
                    formData: {
                        uploadDir: self.data.category,
                        fileType: self.data.fileType,
                    },
                    success: function (res) {
                        wx.hideLoading()
                        if (res.statusCode == 200) {
                            let result = JSON.parse(res.data);
                            if (result.status) {
                                let list = [{ name: self.data.name, url: result.data.fileurl }];
                                fileList = fileList.concat(list);
                                self.setData({ fileList });
                                resolve();
                            } else {
                                app.alert.show(result.errmsg, reject(result.errmsg));
                            }
                        } else {
                            app.alert.show('状态:' + res.statusCode + ',提示:' + res.errMsg, reject(res.errMsg));
                        }
                    },
                    fail: function (err) {
                        wx.hideLoading()
                        app.alert.show(err.errMsg, reject(err.errMsg));
                    }
                });
            })
        },

        // 删除图片
        delFile(e) {
            wx.showModal({
                title: '提示',
                content: '确定要删除吗?',
                success: res => {
                    if (res.confirm) {
                        let fileList = this.data.fileList;
                        fileList.splice(parseInt(e.currentTarget.dataset.index), 1);
                        this.setData({ fileList })
                        this.triggerEvent("uploadFiles", {
                            list: fileList,
                            name: this.data.name
                        });
                        wx.showToast({
                            title: '删除成功',
                            icon: 'success',
                            duration: 2000
                        })
                    }
                }
            })
        },

        // 预览图片
        viewImage(e) {
            let urls = this.data.fileList.map(item => { return item.url });
            wx.previewImage({
                current: e.currentTarget.dataset.url,
                urls
            });
        },

    }
})

uploadImg.less

.upload-wrap {
  .list-wrap {
    display: flex;
    flex-wrap: wrap;
    .item {
      position: relative;
      width: 188rpx;
      height: 188rpx;
      margin-top: 40rpx;
      margin-right: calc(~"(100% - 564rpx) / 3");

      .file {
        width: 100%;
        height: 100%;
        vertical-align: middle;
        border-radius: 8rpx;
      }

      .icon-delete {
        width: 40rpx;
        position: absolute;
        right: -10rpx;
        top: -10rpx;
      }
    }
  }

  .add-wrap {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-direction: column;
    width: 188rpx;
    height: 188rpx;
    margin-top: 40rpx;
    border: 1px dashed #979797;
    border-radius: 8rpx;
    background-color: #f9fafb;
    text-align: center;

    .icon-camera {
      width: 50rpx;
      height: 46rpx;
      pointer-events: none;
    }
  }
}

 uploadImg.json

{
  "component": true,
  "usingComponents": {}
}

应用

<upload-img category="Personal" pageFileList="{{form.image}}" maxCount="3" disabled bind:uploadFiles="uploadFiles">
</upload-img>

 data: {
        form: {
            image: '[{"name":"Image","url":"https://wechatmp.uatwechat.com/upload/PersonalCompressed/20230614/20230614114423503.jpeg"}]',
            video: ''
        },
    },



uploadFiles(e) {
        let str = "form." + e.detail.name;
        let list = e.detail.list;
        if (list.length > 0) {
            this.setData({
                [str]: JSON.stringify(e.detail.list)
            })
        } else {
            this.setData({
                [str]: '',
            })
        }
    },

app.alert方法封装 alert.js,然后在在app.js引入可使用

const show = (message, showCancel, successCallback = function() {}) => {
    wx.showModal({
        title: '提示',
        content: message,
        confirmColor: '#DB6276',
        showCancel: showCancel,
        success(res) {
            if (res.confirm) {
                successCallback();
            }
        }
    })
}

module.exports = {
    show
}

小程序上传多张图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1846486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

URLDNS利用链

利用链分析在我的Github主页 Java反序列化学习 下面写下POC思路 利用点HashMap的readObject private void readObject(java.io.ObjectInputStream s)throws IOException, ClassNotFoundException {// Read in the threshold (ignored), loadfactor, and any hidden stuffs.de…

大数据学习-Hadoop

介绍 是 Apache 的顶级开源项目&#xff0c;一个分布式框架&#xff0c;主要功能&#xff1a; 分布式大数据存储——HDFS 组件分布式大数据计算——MapReduce 组件分布式资源调度——YARN 组件 可以通过它来构建集群&#xff0c;完成大数据的存储和计算 学习起来相对简单&…

中国计算机学会芯片大会 (CCF Chip 2024)

&#x1f31f; 中国计算机学会芯片大会(CCF Chip Conference&#xff0c;简称&#xff1a;CCF Chip) 将于&#x1f4c5; 2024年7月19日至21日在上海市松江区上海富悦大酒店召开。 &#x1f389; #CCF Chip 2024# 主题前瞻&#xff1a;"发展芯技术&#xff0c;智算芯未来&q…

树结构与算法-杨辉三角形的两种实现

什么是杨辉三角形 本文旨在讨论普通杨辉三角形的两种实现方式&#xff1a;迭代法和递归法。我们不详细讲解杨辉三角形的数学问题&#xff0c;只研究其代码实现。 杨辉三角形大致如下图&#xff1a; 杨辉三角形的规律 通过对杨辉三角形的图形分析&#xff0c;我们可以看到这几点…

CVPR最佳学生论文!1千万张图像、跨越45万+物种的超大数据集,多模态模型BioCLIP实现零样本学习

不同于传统学术领域对期刊发表的重视&#xff0c;计算机界&#xff0c;尤其是机器学习、计算机视觉、人工智能等领域&#xff0c;顶级会议才是王道&#xff0c;无数「热门研究方向」、「创新方法」都将从这里流出。 作为计算机视觉乃至人工智能领域最具学术影响力的三大顶会之…

【论文笔记】The Power of Scale for Parameter-Effificient Prompt Tuning

题目: The Power of Scale for Parameter-Effificient Prompt Tuning 来源: EMNLP 2021 模型名称: Soft-Prompt 论文链接: https://aclanthology.org/2021.emnlp-main.243/ 项目链接: https://github.com/google-research/prompt-tuning 核心&#xff1a;针对不同的任务设计不同…

基于STM32和人工智能的智能交通信号控制系统

目录 引言环境准备智能交通信号控制系统基础代码实现&#xff1a;实现智能交通信号控制系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能交通管理与优化问题解决方案与优化收尾与总结 1. 引言 随着城市化进程的加快&a…

16s功能注释--PICRUST2的安装及使用

文章目录 安装本地安装conda安装 使用一些报错 安装 本地安装 在github网址下载压缩包&#xff1a;https://github.com/picrust/picrust2/releases/tag/v2.5.2 解压后将bin目录设置到环境变量 conda安装 利用bioconda安装 conda create -n picrust2 -c bioconda -c conda-…

神经网络与模式识别课程报告-卷积神经网络(CNN)算法的应用

完整的神经网络与模式识别课程报告文档下载&#xff1a; https://wenku.baidu.com/view/393fbc7853e2524de518964bcf84b9d528ea2c92?aggId393fbc7853e2524de518964bcf84b9d528ea2c92&frcatalogMain_&_wkts_1718955412936 def get_information():方法名称: 获取资料或…

以餐厅为例,来谈谈VOC(客户之声)

VOC&#xff0c;即客户之声&#xff0c;是指通过收集和分析客户的反馈意见&#xff0c;了解他们的需求和期望&#xff0c;进而指导企业改进产品和服务。在餐厅经营中&#xff0c;VOC的应用不仅能够帮助餐厅了解顾客的口味偏好、用餐习惯&#xff0c;还能揭示服务流程中的不足和…

插件分析|Yaklang SQL Injection 检测启发式算法

背景 sqlmap作为一个老牌的成熟的SQL漏洞扫描工具&#xff0c;在SQL注入自动化检测领域独占一壁江山。而现在的SQL注入检测往往是通过被动扫描检出&#xff0c;再通过sqlmap或者手工注入的方式进行进一步的漏洞确认和利用。在这种情形下&#xff0c;我们就需要开发一款应用于被…

ATFX Connect四度加冕!荣膺2024最佳机构业务经纪商奖

近期&#xff0c;知名经纪商ATFX凭借在公益、科技、教育及媒体领域的一系列创新营销举措&#xff0c;掀起一波营销热潮&#xff0c;品牌联动效应显著。日前&#xff0c;ATFX又以实力而赢得一项新荣誉。全球知名媒体Holiston Media举办的2024环球金融大奖 (Global Forex Awards …

10个超好看的 404 页面(附源码)

今天来分享 10 个超好看的 404 页面&#xff0c;带动画效果。 代码&#xff1a;https://codepen.io/AsyrafHussin/pen/KxWRrK 代码&#xff1a;https://codepen.io/salehriaz/pen/erJrZM 代码&#xff1a;https://codepen.io/andrew-lawendy/pen/deOpMZ 代码&#xff1a;https…

如何减轻大语言模型中的幻觉?

ChatGPT、LLaMA 和 Mistral 等大型语言模型 (LLMs) 是强大的自然语言处理 (NLP) 工具&#xff0c;能够为各种应用生成流畅且连贯的文本。然而&#xff0c;他们也有一个主要缺点&#xff1a;他们倾向于产生幻觉&#xff0c;而这些事实或细节不受输入或现实世界的支持。这可能会导…

《传感器系列》温度传感器

温度传感器是一种能够测量温度并将温度信号转换为电信号或其他可输出信号的装置。 它在众多领域都有广泛应用&#xff0c;比如&#xff1a; - 工业生产&#xff1a; 用于监测生产过程中的温度&#xff0c;确保生产工艺的正常进行和产品质量的稳定。 - 智能家居&#xff1a; …

PCB设计中的via孔和pad孔

原文出自微信公众号【小小的电子之路】 在PCB设计过程中&#xff0c;经常会提到via孔和pad孔&#xff0c;下面就简单介绍一下二者的区别。 via称为过孔&#xff0c;主要起到电气连接的作用&#xff0c;用于网络在不同层的导线之间的连接。PCB设计中一般做盖油处理。 via孔 vi…

Kotlin 中的可见修饰符

Java 和 Kotlin 中的可见修饰符&#xff1a; Java&#xff1a;public、private、protected 和 default(什么都不写)&#xff1b;Kotlin&#xff1a;public、private、protected 和 internal&#xff1b; 比较&#xff1a; 对于 public 修饰符&#xff1a;在 Java 和 Kotlin 中…

Linux网络 - 再谈、详谈UDP和TCP协议

文章目录 前言预备netstatpidofcat /etc/services 一、UDP协议UDP协议端格式UDP的缓冲区基于UDP的应用层协议 二、TCP协议1.TCP协议段格式确认应答(ACK)机制三次握手疑问1 最后一次客户端发给服务端的ACK请求怎么保证服务端能够收到&#xff1f; 四次挥手疑问2 为什么挥手是四次…

openssl 命令行生成密钥对,生成hash,PSS填充签名,校验

生成密钥对 openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:4096 openssl rsa -pubout -in private_key.pem -out public_key.pem将源文件data.txt生成hash值&#xff08;sha-256&#xff09; openssl dgst -sha256 -binary data.txt > d…

利用LabVIEW项目管理和组织LabVIEW应用程序

如何利用LabVIEW项目管理和组织LabVIEW应用程序&#xff0c;提供了关于文件定义、磁盘上的文件组织、LabVIEW项目浏览器、交叉链接和相关资源的建议。这些推荐在开发前就应建立&#xff0c;以确保应用程序能扩展到大量VIs并适应多开发者环境。 目录 定义和识别应用程序文件 磁…