Skip to content

Upload 文件上传

提供便捷的文件上传功能,支持上传进度监听和任务控制管理。该模块封装了 uni-appx 的文件上传能力,提供更简洁的 API 接口。如需可视化上传组件,请使用 cl-upload 组件。

API 方法

方法名参数返回值说明
uploadpath: stringPromise<string>通过文件路径上传,返回文件 URL
uploadFilefile: ChooseImageTempFile, options?: UploadOptionsPromise<string>通过文件对象上传,返回文件 URL

类型定义

ts
// 上传文件对象(uni-appx 选择文件返回的格式)
interface ChooseImageTempFile {
	path: string; // 文件本地临时路径
	size: number; // 文件大小(字节)
	name: string; // 文件名称
	type: string; // 文件类型(MIME 类型)
}

// 上传进度信息
interface OnProgressUpdateResult {
	progress: number; // 上传进度百分比 (0-100)
	totalBytesSent: number; // 已发送字节数
	totalBytesExpectedToSend: number; // 预期发送总字节数
}

// 上传任务控制器
interface UploadTask {
	abort(): void; // 中止上传任务
}

// 上传配置选项
interface UploadOptions {
	onProgressUpdate?: (result: OnProgressUpdateResult) => void; // 上传进度监听回调
	onTask?: (task: UploadTask) => void; // 获取上传任务实例,用于控制上传
}

使用示例

基础路径上传

最简单的上传方式,直接传入文件路径:

ts
import { upload } from "@/.cool";

function handleUpload() {
	uni.chooseImage({
		count: 1,
		success(res) {
			// 开始上传文件
			upload(res.tempFilePaths[0])
				.then((url) => {
					console.log("上传成功,文件地址:", url);
					// 处理上传成功后的逻辑
				})
				.catch((error) => {
					console.error("上传失败:", error);
					// 处理上传失败的情况
				});
		},
		fail(error) {
			console.error("选择文件失败:", error);
		}
	});
}

单个文件上传

单个文件上传示例,支持监听上传进度和中止上传任务:

ts
import { uploadFile } from "@/.cool";

function handleAdvancedUpload() {
	uni.chooseImage({
		count: 1, // 最多选择1个文件
		success(res) {
			// 单个文件上传
			uploadFile(tempFiles[0], {
				onProgressUpdate: ({ progress }) => {
					console.log(`上传进度:${progress}%`);
				}
			})
				.then((url) => {
					console.log("单个文件上传成功:", url);
				})
				.catch((error) => {
					console.error("单个文件上传失败:", error);
				});
		},
		fail(error) {
			console.error("选择文件失败:", error);
		}
	});
}

多个文件上传

通过遍历 tempFiles 数组,对每个文件调用 uploadFile 方法实现批量上传,支持进度监听和错误处理。

ts
import { uploadFile } from "@/.cool";

function handleAdvancedUpload() {
	uni.chooseImage({
		count: 9, // 最多选择9个文件
		success(res) {
			if (Array.isArray(res.tempFiles)) {
				// 批量上传多个文件
				res.tempFiles.forEach((file, index) => {
					uploadFile(file, {
						// 监听上传进度
						onProgressUpdate: ({
							progress,
							totalBytesSent,
							totalBytesExpectedToSend
						}) => {
							console.log(`文件${index + 1}上传进度:${progress}%`);
							console.log(
								`已上传:${totalBytesSent} / 总大小:${totalBytesExpectedToSend}`
							);
						}
					})
						.then((url) => {
							console.log(`文件${index + 1}上传成功:`, url);
						})
						.catch((error) => {
							console.error(`文件${index + 1}上传失败:`, error);
						});
				});
			}
		},
		fail(error) {
			console.error("选择文件失败:", error);
		}
	});
}