uniapp批量上传图片和视频

Uniapp实现图片视频批量上传
  1. uniapp实现图片视频批量上传
  2. 一般这种批量上传 后端处理会比较好 目前此文章 只展示前端实现 前端需要循坏调用上传的接口 一般也不建议前端批量的去调用这个接口 会对网络资源造成较大压力,甚至可能导致浏览器或服务器出现性能问题。如果服务器端对并发请求有限制,这种方式可能会导致部分请求失败。

核心代码 如下

fileUpdate() {
				console.log('开始上传,videoList:', this.videoList);
				console.log('开始上传,imageList:', this.imageList);
			    uni.showLoading({
			        mask: true,
			        title: "上传中..."
			    });
			    let _this = this;
			    let filePaths = this.videoList.concat(this.imageList);
			    console.log("filePaths-----------", filePaths);
			    if (filePaths.length === 0) {
			        uni.showToast({
			            icon: "none",
			            title: "暂无需要上传的"
			        });
			        return;
			    }
			    let uploadNum = filePaths.length;
			    let api = AppConfig.SERVICE_URL +   "你的后端接口";
			
			    // 定义一个递归函数来依次上传文件
			    function uploadNext(index) {
			        if (index >= filePaths.length) {
			            uni.hideLoading();
			            if (_this.videoList.length > 0 || _this.imageList.length > 0) {
							console.log('未上传成功的视频列表:', _this.videoList);
							console.log('未上传成功的图片列表:', _this.imageList);
			                // uni.showToast({
			                //     title: "部分影像未上传成功,请再次保存!",
			                //     icon: "none",
			                // });
							this.videoList=[]
							this.imageList=[]
			            } else {
			                uni.showToast({
			                    title: "上传完成!",
			                    icon: "none",
			                });
			            }
			            return;
			        }
			
			        let item = filePaths[index];
			        item.fileName = _this.getFileName(item.tempFilePath);
			        console.log("filePaths22222222", item.fileName);
			        let formData = {
			            token: "",
			            channelCode: "xcx",
			            objectNo: _this.businessNumber,
			            objectType: "xxxx",
			            objectName: "xxxxx",
			            queryTime: _this.reportDate,
			            itemno: "2901",
			            longitude: _this.longitude,
			            latitude: _this.latitude,
			            address: _this.address,
			            fileName: item.fileName,
			            Method: 'upload',
			            Action: 'upload'
			        };
			
			        uni.uploadFile({
			            url: api,
			            filePath: item.tempFilePath,
			            name: 'file',
			            formData: formData,
			            success: (res) => {
			                try {
			                    res.data = JSON.parse(res.data);
			                    if (res.data.result === 'SUCCESS') {
			                        _this.removeSuccessFile(res.data.fileName);
									_this.$forceUpdate(); // 强制更新组件
			                    }
			                } catch (e) {
			                    // 处理解析异常
			                }
			            },
			            fail: (err) => {
			                console.log("err", err);
			                uni.showToast({
			                    title: err.errMsg,
			                    icon: "none"
			                });
			            },
			            complete: () => {
			                uploadNext(index + 1);
			            }
			        });
			    }
			
			    // 开始上传第一个文件
			    uploadNext(0);
			},

这里就结束啦

扩展一下: 前端批量实现单个接口的调用 比如 全选 取消购物车

      batchCancelCart() {
    // 从this.dataList[2]中筛选出被选中的商品项(selected为true的项)
    const selectedItems = this.dataList[2].filter(item => item.selected);
    // 如果没有选中的商品项,直接返回,不进行后续操作
    if (selectedItems.length === 0) {
        return;
    }
    // 弹出确认对话框,询问用户是否确认批量取消商品的购物车
    this.$confirm('是否确认批量取消商品的购物车?', '提示', {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning'
    }).then(() => {
        // 对于每个被选中的商品项,创建一个删除请求的Promise数组
        const requests = selectedItems.map(item => {
            return this.$api.deleteFavorite({
                id: item.favoriteId
            }).then(res => {
                // 如果请求成功(status_code为1)
                if (res.status_code === 1) {
                    // 找到该商品项在this.dataList[2]中的索引
                    const index = this.dataList[2].findIndex(i => i.id === item.id);
                    // 如果索引存在(大于 -1),从this.dataList[2]中删除该商品项
                    if (index > -1) {
                        this.dataList[2].splice(index, 1);
                    }
                    // 返回请求结果
                    return res;
                } else {
                    // 如果请求失败,返回一个被拒绝的Promise,携带错误信息
                    return Promise.reject(res.msg);
                }
            }).catch(error => {
                // 捕获请求过程中的错误,返回一个被拒绝的Promise,携带错误信息
                return Promise.reject(error);
            });
        });

        // 并行执行所有请求,并等待所有请求完成(无论成功或失败)
        Promise.allSettled(requests).then(results => {
            // 统计成功的请求数量
            const successCount = results.filter(result => result.status === 'fulfilled').length;
            // 统计失败的请求数量
            const failedCount = results.filter(result => result.status === 'rejected').length;

            // 如果有成功的请求,显示成功消息
            if (successCount > 0) {
                this.$message({
                    message: `成功取消 ${successCount} 项商品的购物车`,
                    type: 'success'
                });
            }

            // 如果有失败的请求,拼接错误信息并显示错误消息
            if (failedCount > 0) {
                const errorMessages = results
                   .filter(result => result.status === 'rejected')
                   .map(result => result.reason)
                   .join(';');
                this.$message.error(`部分取消失败:${errorMessages}`);
            }

            // 更新全选状态,判断是否所有商品项都被选中
            this.isAllSelected = this.dataList[2].length > 0 && this.dataList[2].every(item => item.selected);
        });
    }).catch(() => {
        // 用户取消操作时执行的代码,这里没有具体逻辑,仅作为占位
    });
},
UniApp 开发中,文件上传功能是常见的需求之一。针对这一场景,以下是一些推荐的文件上传插件或组件,它们可以帮助开发者高效、灵活地实现高质量的文件上传功能。 ### 1. **UniApp-File-Upload** 这是一个专门为 UniApp 框架设计的文件上传组件,具有良好的兼容性易用性。它支持多文件上传、进度条显示、上传前预览等功能,并且可以通过简单的配置快速集成到项目中。无论你是新手还是经验丰富的开发者,这个组件都能显著减少代码维护成本并提升开发效率[^1]。 ### 2. **uniapp-upload** `uniapp-upload` 是一个轻量级的文件上传插件,适用于需要高度定制化上传逻辑的应用场景。该插件提供了丰富的 API 接口,允许开发者根据业务需求自定义上传路径、请求头信息以及上传成功或失败时的回调函数。此外,它还支持断点续传批量上传等高级特性。 ### 3. **uni-file-picker** 这是基于 UniApp 官方提供的 `uni-file-picker` 组件,用于实现文件选择与上传的基本功能。虽然它的功能相对简单,但胜在稳定可靠且无需额外引入第三方依赖。对于只需要基础上传功能的小型应用来说,这是一个不错的选择。 ### 4. **uni-uploader** `uni-uploader` 是另一个流行的 UniApp 文件上传组件,支持图片视频等多种类型的文件上传。它内置了多种样式模板,可以根据项目风格进行灵活调整。同时,该组件也支持异步上传上传前压缩图片等功能,非常适合用于社交类或电商类应用中的用户头像、商品图片上传等场景。 ### 示例代码 以下是使用 `uniapp-upload` 插件设置默认图片数据的一个示例: ```javascript // 设置默认图片路径数组 let photos = ['/storage/img/20240721/240721160844178985839.png', '/storage/img/20240721/240721160844896181165.png']; // 调用 setItems 方法设置默认值 this.$refs.upload.setItems(photos); ``` 以上这些插件组件都可以很好地满足不同场景下的文件上传需求。开发者可以根据项目的具体要求选择合适的工具,从而提高开发效率并确保用户体验的一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值