在uni-app中实现选择和上传非图像、视频文件的几种方案

 更新时间:2025年06月06日 11:02:28   作者:疯狂的沙粒  
在移动应用开发中,文件上传是一个常见的需求,比如用户上传头像、图片、文档等,UniApp 作为一个跨平台的开发框架,为开发者提供了便捷的方式来实现文件上传功能,本文小编给大家介绍了uni-app如何实现选择和上传非图像、视频文件,需要的朋友可以参考下

在 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);
  }
});

注意事项

  • rl 要替换成真实的服务端上传接口地址,需服务端配合实现文件接收逻辑(如 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 端样式不满意 ),再针对性用对应补充方案解决,同时注意服务端配合做好文件接收、校验逻辑 。

以上就是在uni-app中实现选择和上传非图像、视频文件的方案的详细内容,更多关于uni-app选择和上传非图像、视频文件的资料请关注脚本之家其它相关文章!

相关文章

  • JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)

    JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)

    下面小编就为大家带来一篇JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • Echarts横向堆叠柱状图和markLine实例详解

    Echarts横向堆叠柱状图和markLine实例详解

    一些柱形图在数据量比较多的时候,横向排列受到挤压,导致柱形图,变的非常细,影响整体的效果,所以应该将柱形图堆叠起来,这样就会好很多,下面这篇文章主要给大家介绍了关于Echarts横向堆叠柱状图和markLine的相关资料,需要的朋友可以参考下
    2022-06-06
  • js HTML5 Canvas绘制转盘抽奖

    js HTML5 Canvas绘制转盘抽奖

    这篇文章主要为大家详细介绍了js HTML5 Canvas绘制转盘抽奖,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Bootstrap如何创建表单

    Bootstrap如何创建表单

    这篇文章主要为大家详细介绍了Bootstrap如何创建表单,介绍了Bootstrap表单的三种类型,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 微信小程序实现多张照片上传功能

    微信小程序实现多张照片上传功能

    这篇文章主要介绍了微信小程序实现多张照片上传功能,当服务器的状态码为200且图片上传完毕后将图片的src转化为Json字符串存在数组中以便将其添加到数据库,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 页面向下滚动ajax获取数据的实现方法(兼容手机)

    页面向下滚动ajax获取数据的实现方法(兼容手机)

    下面小编就为大家带来一篇页面向下滚动ajax获取数据的实现方法(兼容手机)。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • JS使用可选链操作符 (?.) 进行空值检查的操作

    JS使用可选链操作符 (?.) 进行空值检查的操作

    在 JavaScript 中,处理嵌套对象或数组时,经常会遇到空值检查的问题,传统的空值检查通常比较繁琐,容易导致代码冗长且难以阅读,ES2020 引入了可选链操作符 (?.),极大地简化了这些检查过程,本文介绍了JS使用可选链操作符 (?.) 进行空值检查的操作
    2024-12-12
  • 一个报数游戏js版(约瑟夫环问题)

    一个报数游戏js版(约瑟夫环问题)

    随便给一个数 比如100,那么从1到100围成一个圆圈,然后就类似123123报数一样逢3就舍掉,一直这样轮询 那么最后剩下来的那个数是多少?
    2010-08-08
  • JavaScript 接口原理与用法实例详解

    JavaScript 接口原理与用法实例详解

    这篇文章主要介绍了JavaScript 接口原理与用法,结合实例形式详细分析了JavaScript 接口原理、优缺点、用法及操作注意事项,需要的朋友可以参考下
    2020-05-05
  • JS获取下拉列表所选中的TEXT和Value的实现代码

    JS获取下拉列表所选中的TEXT和Value的实现代码

    本篇文章主要是对JS获取下拉列表所选中的TEXT和Value的实现代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01

最新评论