uni-app 如何实现选择和上传非图像、视频文件?

news2025/6/7 19:19:32

在 uni-app 中实现选择和上传非图像、视频文件,可根据不同端(App、H5、小程序)的特点,采用以下方法:

一、通用思路(多端适配优先推荐)

借助 uni.chooseFile 选择文件,再用 uni.uploadFile 上传,不过部分端有差异,需针对性处理:

1. 选择文件(uni.chooseFile
uni.chooseFile({
  count: 1, // 可选择文件数量,按需调整
  type: 'file', // 选择任意类型文件,若想限制类型,可结合 extension 筛选
  success: (res) => {
    const tempFilePath = res.tempFiles[0].path; // 获取选中文件的临时路径
    // 后续可执行上传等操作
  },
  fail: (err) => {
    console.error('选择文件失败:', err);
  }
});
  • 参数说明
    • count:控制最多选几个文件,按需设值。
    • type:设为 'file' 可选择非媒体文件;若想限定特定类型(如文档),可搭配 extension(H5 端支持 ),例 extension: ['.pdf', '.docx'] ,不过 App 和小程序端对 extension 支持度欠佳,复杂类型筛选可结合后续服务端校验。
    • 选中后,res.tempFiles 里存文件信息,含临时路径 path 、文件名 name 、大小 size 等 。
2. 上传文件(uni.uploadFile

拿到选择的文件临时路径后,用 uni.uploadFile 上传到服务器:

uni.uploadFile({
  url: 'https://your-server.com/upload', // 实际的服务端文件上传接口
  filePaths: [tempFilePath], // 前面选择文件得到的临时路径
  name: 'file', // 与服务端约定的接收文件的字段名
  formData: {
    // 可附带其他业务参数,如用户 ID、文件分类等
    userId: '123',
    category: 'document'
  },
  success: (uploadRes) => {
    const data = JSON.parse(uploadRes.data);
    console.log('上传成功,服务端返回:', data);
    // 可依据服务端返回做后续处理,如更新文件列表、提示用户等
  },
  fail: (err) => {
    console.error('上传失败:', err);
  }
});
  • 注意事项
    • url 要替换成真实的服务端上传接口地址,需服务端配合实现文件接收逻辑(如 Node.js + Express 用 multer 中间件、Java 用 Spring Boot 的文件上传解析等 )。
    • name 字段要和服务端接口约定一致,否则服务端无法正确识别文件。
    • 若需更灵活的请求头设置、进度监听等,可结合 uni.request 自己构建上传逻辑(把文件转成二进制流等方式 ),不过 uni.uploadFile 已封装常见场景,优先推荐。

二、App 端特殊处理(解决兼容性问题)

uni.chooseFile 在 App 端选非媒体文件有兼容性问题(如部分安卓机型选特定文件失败 ),可借助 5+App 的 plus.io.chooseFile 实现:

1. 选择文件(plus.io.chooseFile
// 仅 App 端有效,需判断平台后使用
if (uni.getSystemInfoSync().platform === 'android' || uni.getSystemInfoSync().platform === 'ios') {
  plus.io.chooseFile(
    {
      title: '选择文件', // 选择文件的标题提示
      filter: '*', // 筛选文件类型,* 表示所有,也可设 '.pdf,.docx' 等
      multiple: false // 是否多选
    },
    (res) => {
      const fileInfo = res.files[0]; // 获取选中的文件信息
      const localPath = fileInfo.path; // 文件本地路径
      // 可通过 plus.io 进一步操作文件,如读取内容、转成可上传的格式
      // 示例:转成临时文件路径,用于 uni.uploadFile
      const tempFilePath = plus.io.convertLocalFileSystemURL(localPath); 
      // 执行上传等操作
    },
    (err) => {
      console.error('选择文件失败:', err);
    }
  );
}
  • 优势:对 App 端文件系统兼容性更好,能处理一些 uni.chooseFile 覆盖不到的特殊文件选择场景(如安卓分区存储下的文件 )。
  • 不足:是 5+App 专有 API,H5 和小程序端无法使用,需做平台判断,增加代码复杂度。
2. 上传文件

拿到文件路径后,同样可用 uni.uploadFile 上传,若遇到文件格式不兼容问题(如服务端需特定二进制流 ),可先用 plus.io 读取文件内容转成合适格式再上传:

plus.io.resolveLocalFileSystemURL(localPath, (entry) => {
  entry.file((file) => {
    const fileReader = new plus.io.FileReader();
    fileReader.onloadend = (e) => {
      const buffer = e.target.result; // 文件内容的 Buffer 数据
      // 若服务端需要 FormData 格式,可构造后用 uni.request 上传
      const formData = new FormData();
      formData.append('file', new Blob([buffer]), file.name); 
      uni.request({
        url: 'https://your-server.com/upload',
        method: 'POST',
        header: {
          'Content-Type': 'multipart/form-data'
        },
        data: formData,
        success: (res) => {
          console.log('上传成功:', res.data);
        }
      });
    };
    fileReader.readAsArrayBuffer(file);
  });
});

三、H5 端补充(利用浏览器特性)

H5 端除了用 uni.chooseFile ,还可直接用 HTML 原生的 <input type="file"> 实现更灵活的文件选择(若 uni.chooseFile 样式、功能满足不了需求时 ):

1. 在页面中添加 input 元素(可通过条件编译仅在 H5 端显示 )
<template>
  <view>
    <!-- #ifdef H5 -->
    <input 
      type="file" 
      style="display: none;" 
      ref="fileInput" 
      @change="handleFileChange" 
    />
    <button @click="openFileSelector">选择文件</button>
    <!-- #endif -->
  </view>
</template>

<script>
export default {
  methods: {
    openFileSelector() {
      this.$refs.fileInput.click(); // 触发文件选择框
    },
    handleFileChange(e) {
      const file = e.target.files[0]; // 获取选中的文件
      const fileReader = new FileReader();
      fileReader.onload = (event) => {
        const fileContent = event.target.result; // 文件内容,可转成 Base64 等
        // 若要上传,可构造 FormData 用 uni.request 或 axios 等上传
        const formData = new FormData();
        formData.append('file', file);
        uni.request({
          url: 'https://your-server.com/upload',
          method: 'POST',
          header: {
            'Content-Type': 'multipart/form-data'
          },
          data: formData,
          success: (res) => {
            console.log('上传成功:', res.data);
          }
        });
      };
      fileReader.readAsArrayBuffer(file);
    }
  }
}
</script>
  • 特点:完全基于浏览器原生能力,自定义程度高,可灵活控制文件选择后的处理流程(如读取文件内容预览、做加密等 ),但需自己处理多端兼容(仅 H5 端能用 ),且样式需自己调整。

四、小程序端限制与适配

小程序端 uni.chooseFile 本质是调用各小程序平台的文件选择 API,整体流程和前面通用方法一致,但有以下限制:

  • 文件类型与大小:不同小程序平台对可选择的文件类型、大小有约束(如微信小程序限制单文件最大 100MB 等 ),需在开发时注意。
  • 接口能力uni.uploadFile 需配置合法域名,且服务端要做相应跨域等配置,否则无法上传成功。

五、方案推荐与总结

  • 优先推荐:用 uni.chooseFile + uni.uploadFile 的通用方案,多端兼容性较好,能覆盖大部分场景(如上传文档、压缩包等非媒体文件 ),简单易实现。
  • App 端特殊场景:若通用方案有兼容性问题(如选文件失败 ),补充 plus.io.chooseFile 的方式,增强对 App 端文件系统的适配。
  • H5 端自定义需求:结合原生 <input type="file"> 实现更灵活的文件选择和预处理逻辑。

实际开发中,建议先尝试通用方案,遇到特定端问题(如 App 端选某些文件报错、H5 端样式不满意 ),再针对性用对应补充方案解决,同时注意服务端配合做好文件接收、校验逻辑 。

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

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

相关文章

【数据分析】基于adonis2与pairwise.adonis2的群组差异分析教程

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理adonis分析pairwise.adonis2分析总结系统信息介绍 本教程主要用于执行和分析基于距离矩阵的多样性和群落结构分析,特别是通过adonis2和pairwi…

Nginx + Tomcat负载均衡群集

目录 一、案例环境 二、部署 Tomcat&#xff08;102/103&#xff09; 1、准备环境 &#xff08;1&#xff09;关闭firewalld 防火墙 &#xff08;2&#xff09;安装JDK 2、安装配置 Tomcat &#xff08;1&#xff09;Tomcat 的安装和配置 &#xff08;2&#xff09;移动…

嵌入式开发之STM32学习笔记day22

STM32F103C8T6 FLASH闪存 1 FLASH简介 STM32F1系列微控制器的FLASH存储器是一种非易失性存储器&#xff0c;它在微控制器中扮演着至关重要的角色。以下是对STM32F1系列FLASH存储器及其相关编程方式的扩展说明&#xff1a; 【FLASH存储器的组成部分】 程序存储器&#xff1a;这…

分词算法BBPE详解和Qwen的应用

一、TL&#xff1b;DR BPE有什么问题&#xff1a;依旧会遇到OOV问题&#xff0c;并且中文、日文这些大词汇表模型容易出现训练中未出现过的字符Byte-level BPE怎么解决&#xff1a;与BPE一样是高频字节进行合并&#xff0c;但BBPE是以UTF-8编码UTF-8编码字节序列而非字符序列B…

多线程下使用缓存+锁Lock, 出现“锁失效” + “缓存未命中竞争”的缓存击穿情况,双重检查缓存解决问题

多线程情况下&#xff0c;想通过缓存同步锁的机制去避免多次重复处理逻辑&#xff0c;尤其是I/0操作&#xff0c;但是在实际的操作过程中发现多次访问的日志 2025-06-05 17:30:27.683 [ForkJoinPool.commonPool-worker-3] INFO Rule - [vagueNameMilvusReacll,285] - embeddin…

Playwright 测试框架 - .NET

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】

命令行以TLS/SSL显式加密方式访问FTP服务器

昨天留了一个小尾巴~~就是在命令行或者代码调用命令&#xff0c;以TLS/SSL显式加密方式&#xff0c;访问FTP服务器&#xff0c;上传和下载文件。 有小伙伴可能说ftp命令不可以吗&#xff1f;不可以哦~~ ftp 命令本身不支持显式加密。要实现 FTP 的显式加密&#xff0c;可以使…

Linux配置yum 时间同步服务 关闭防火墙 关闭ESlinux

1、配置yum 1.1、Could not resolve host: mirrorlist.centos.org; 未知的错误 https://blog.csdn.net/fansfi/article/details/146369946?fromshareblogdetail&sharetypeblogdetail&sharerId146369946&sharereferPC&sharesourceRockandrollman&sharefr…

LLaMA-Factory和python版本的兼容性问题解决

引言 笔者今天在电脑上安装下LLaMA-Factory做下本地的模型调优。 从github上拉取代码git clone https://github.com/hiyouga/LLaMA-Factory.git. pycharm建立工程,按照官网指导如下: LLaMA-Factory 安装 在安装 LLaMA-Factory 之前&#xff0c;请确保您安装了下列依赖: 运行以…

每日算法-250605

每日算法 - 20240605 525. 连续数组 题目描述 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。 思路 前缀和 哈希表 解题过程 核心思想是将问题巧妙地转换为寻找和为特定值的子数组问题。 转换问题&#xff1a;我…

分布式锁-Redisson实现

目录 本地锁的局限性 Redisson解决分布式锁问题 在分布式环境下&#xff0c;分布式锁可以保证在多个节点上的并发操作时数据的一致性和互斥性。分布式锁有多种实现方案&#xff0c;最常用的两种方案是&#xff1a;zookeeper和redis&#xff0c;本文介绍redis实现分布式锁方案…

C++学习-入门到精通【14】标准库算法

C学习-入门到精通【14】标准库算法 目录 C学习-入门到精通【14】标准库算法一、对迭代器的最低要求迭代器无效 二、算法1.fill、fill_n、generate和generate_n2.equal、mismatch和lexicographical_compare3.remove、remove_if、remove_copy和remove_copy_if4.replace、replace_…

HarmonyOS运动语音开发:如何让运动开始时的语音播报更温暖

##鸿蒙核心技术##运动开发##Core Speech Kit&#xff08;基础语音服务&#xff09;# 前言 在运动类应用中&#xff0c;语音播报功能不仅可以提升用户体验&#xff0c;还能让运动过程更加生动有趣。想象一下&#xff0c;当你准备开始运动时&#xff0c;一个温暖的声音提醒你“…

vscode使用系列之快速生成html模板

一.欢迎来到我的酒馆 vscode&#xff0c;yyds! 目录 一.欢迎来到我的酒馆二.vscode下载安装1.关于vscode你需要知道2.开始下载安装 三.vscode快速创建html模板 二.vscode下载安装 1.关于vscode你需要知道 Q&#xff1a;为什么使用vscode? A&#xff1a;使用vscode写…

网页前端开发(基础进阶4--axios)

Ajax Ajax(异步的JavaScript和XML) 。 XML是可扩展标记语言&#xff0c;本质上是一种数据格式&#xff0c;可以用来存储复杂的数据结构。 可以通过Ajax给服务器发送请求&#xff0c;并获取服务器响应的数据。 Ajax采用异步交互&#xff1a;可以在不重新加载整个页面的情况下&am…

软件安全:漏洞利用与渗透测试剖析、流程、方法、案例

在数字时代&#xff0c;软件已深度融入生活与工作的方方面面&#xff0c;从手机应用到企业核心系统&#xff0c;软件安全至关重要。而漏洞利用与渗透测试&#xff0c;作为软件安全领域中相互关联的两个关键环节&#xff0c;一个是黑客攻击的手段&#xff0c;一个是安全防护的方…

Haproxy的基础配置

1、参考文档 官方文档&#xff1a;HAProxy version 2.2.22 - Configuration Manual 运维派配置手册&#xff1a;Haproxy-基础配置详解 - 运维派 Haproxy 的配置文件haproxy.cfg由两大部分组成&#xff0c;分别是global和proxies部分。 2、haproxy global 配置 global&…

考研系列—操作系统:冲刺笔记(1-3章)

目录 第一章 计算机系统概述 1.基本概念 2.内核态和用户态 3.中断(外中断)、异常(内中断-与当前执行的) 4.系统调用 5.操作系统引导程序 2021年真题: 6.操作系统结构 大纲新增 (1)分层结构 (2)模块化 (3)外核 7.虚拟机 第二章 进程管理 1.画作业运行的顺序和甘…

Java调用大模型API实战指南

文章目录 前言调用大模型的流程概述和基本原理获取 DeepSeek 的 API keyJava 实现调用大模型 API 的Demo进阶扩展建议 前言 随着大语言模型&#xff08;如 OpenAI、DeepSeek、通义千问等&#xff09;的发展&#xff0c;我们可以很方便地用 API 接口调用这些强大的智能助手。在…

单片机0-10V电压输出电路分享

一、原理图 二、芯片介绍 GP8101是一个PWM信号转模拟信号转换器&#xff0c;相当于一个PWM信号输入&#xff0c;模拟信号输出的DAC。此 芯片可以将占空比为0%到100%的PWM信号线性转换成0-5V或者0-10V的模拟电压&#xff0c;并且输出电压 精度小于1%。GP8101M可以处理高频调制的…