Uniapp实现多种文件类型上传

devtools/2025/3/14 10:57:20/

一、前言

在移动端开发中,文件上传是常见的功能需求。本文将通过Uniapp框架,详细讲解如何实现支持多类型文件(图片、视频、文档等)的上传功能,并解决跨平台兼容性问题😄😄😄。


二、技术方案

2.1 核心API

Uniapp提供了以下关键API:

  • uni.chooseFile:文件选择
  • uni.uploadFile:文件上传
  • uni.getFileInfo:获取文件信息

2.2 平台差异处理

平台文件选择方式限制说明
H5<input type="file">依赖浏览器实现
微信小程序wx.chooseMessageFile需配置合法域名
Appplus.io 文件系统需处理本地文件路径

三、完整实现代码

3.1 文件选择器封装

// 多类型文件选择
function chooseFiles(fileType = 'all') {return new Promise((resolve, reject) => {const extnameMap = {image: ['png', 'jpg', 'jpeg'],video: ['mp4', 'mov'],document: ['pdf', 'doc', 'docx', 'xls']};uni.chooseFile({count: 5, // 最大选择数量extension: fileType === 'all' ? [] : extnameMap[fileType],success: res => {const files = res.tempFiles.map(item => ({path: item.path,name: item.name,size: item.size,type: item.type}));resolve(files);},fail: err => reject(err)});});
}

3.2 文件上传核心方法

// 上传文件到服务器
async function uploadFile(file) {try {const formData = {userId: '123',fileType: file.type};const res = await uni.uploadFile({url: 'https://api.example.com/upload',filePath: file.path,name: 'file',formData,header: {'Authorization': 'Bearer token'}});return JSON.parse(res[1].data);} catch (error) {console.error('上传失败:', error);throw error;}
}

3.3 进度显示实现

// 带进度上传
function uploadWithProgress(file, onProgress) {return new Promise((resolve, reject) => {const task = uni.uploadFile({url: 'https://api.example.com/upload',filePath: file.path,name: 'file',success: (res) => resolve(JSON.parse(res.data)),fail: reject,complete: () => task.offProgressUpdate()});task.onProgressUpdate((res) => {onProgress && onProgress({progress: res.progress,totalBytesSent: res.totalBytesSent,totalBytesExpectedToSend: res.totalBytesExpectedToSend});});});
}

四、界面实现示例

<template><view class="upload-container"><button @click="chooseFiles">选择文件</button><view class="preview-list"><view v-for="(file, index) in files" :key="index" class="file-item"><image v-if="file.type.startsWith('image/')" :src="file.path" mode="aspectFit"/><video v-else-if="file.type.startsWith('video/')" :src="file.path"/><view v-else class="document-icon"><text>{{ getFileExt(file.name) }}</text></view><progress :percent="file.progress" show-info /></view></view></view>
</template><style>
/* 文件预览样式 */
.preview-list {display: grid;grid-template-columns: repeat(3, 1fr);gap: 10px;margin-top: 20px;
}.file-item {position: relative;width: 100px;height: 100px;border: 1px dashed #ddd;
}.document-icon {display: flex;justify-content: center;align-items: center;height: 100%;background: #f0f0f0;
}
</style>

五、服务端配合建议

5.1 文件接收配置(Node.js示例)

const multer = require('multer');
const storage = multer.diskStorage({destination: 'uploads/',filename: (req, file, cb) => {const ext = path.extname(file.originalname);cb(null, `${Date.now()}${ext}`);}
});const upload = multer({storage,limits: {fileSize: 1024 * 1024 * 50 // 50MB},fileFilter: (req, file, cb) => {const allowedTypes = ['image/jpeg', 'image/png', 'video/mp4', 'application/pdf'];cb(null, allowedTypes.includes(file.mimetype));}
});router.post('/upload', upload.single('file'), (req, res) => {// 处理上传成功逻辑
});

六、注意事项🐛

  1. 文件大小限制:需同时在前端和服务端设置
  2. 格式验证:不能仅依赖前端验证
  3. 安全处理
    • 重命名存储文件
    • 扫描恶意文件
    • 设置访问权限
  4. 性能优化
    • 图片压缩(可使用uni.compressImage)
    • 分片上传大文件
    • 断点续传

http://www.ppmy.cn/devtools/166710.html

相关文章

中国软件供应链安全技术指南|DevSecOps敏捷安全技术金字塔V3.0正式发布

2022年12月28日&#xff0c;由悬镜安全主办&#xff0c;3S-Lab软件供应链安全实验室、Linux基金会OpenChain社区、ISC、OpenSCA社区联合协办的第二届全球DevSecOps敏捷安全大会&#xff08;DSO 2022&#xff09;已通过全球直播的形式圆满举行。本届大会以“共生敏捷进化”为主题…

在线商城服务器

1、项目背景 本项目是一个基于 C语言 开发的轻量级 HTTP 服务器&#xff0c;旨在实现基本的静态文件服务和简单的动态请求处理。 核心目标&#xff1a; 支持 HTTP/1.1 协议的 GET/POST 请求解析与响应。 提供静态资源&#xff08;HTML、图片等&#xff09;的快速分发。 作为学…

eclipse运行问题

你在 D:\Personal_Finance_System\eclipse\eclipse\configuration 目录下没有发现 .log 文件&#xff1a; 方法 &#xff1a;强制 Eclipse 生成日志 如果 .log 文件不存在&#xff0c;可以尝试让 Eclipse 以 -consoleLog 模式运行&#xff0c;查看错误信息&#xff1a; 打开…

一个差劲的软件设计

项目概况&#xff1a; 之前自己设计并开发了一个用C#开发的上位机软件&#xff0c;整个软件只有一个Form&#xff0c;一个TabControl&#xff0c;3个TabControlPanel&#xff0c;总共100多个lable、textbox、ListBox等控件都放在这3个TabControlPanel里。 问题&#xff1a; 1.…

《C++探幽:运算符重载》

《C探幽:运算符重载》 一、引言 在C中&#xff0c;运算符重载是一项非常强大的特性&#xff0c;它允许程序员重新定义运算符在自定义类型上的行为。通过运算符重载&#xff0c;我们可以让自定义类型&#xff08;如类和结构体&#xff09;的对象像内置类型一样使用运算符&…

云原生服务网格:微服务通信的智能基础设施

引言&#xff1a;从代码耦合到透明化通信的范式升维 Istio管理着超过百万服务端点&#xff0c;Google Anthos通过服务网格实现跨云统一控制面。Envoy每日处理数万亿请求&#xff0c;AWS App Mesh支持万级虚拟节点互联。LinkedIn借助服务网格将故障定位时间缩短至秒级&#xff…

【网络编程】HTTP网络编程

13.1 HTTP 简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(WWW:World Wide Web) 服务器(简称Web 服务器)传输超文本到本地浏览器的传送协议&#xff0c;基于TCP/IP 通信协 议来传递数据 (HTML 文件、图片文件、查询结果等)。 13.2 HTTP 的工作原理 …

洗鞋小程序(源码+文档+讲解+演示)

引言 随着生活水平的提高&#xff0c;人们对洗鞋服务的需求日益增长。洗鞋小程序作为一个智能化平台&#xff0c;为用户提供了便捷、高效的洗鞋服务。本文将详细介绍该小程序的功能、技术架构以及其在提升用户体验中的优势。 系统概述 洗鞋小程序采用前后端分离的架构设计&a…