无

- 发布:2024-04-16 17:28
- 更新:2025-08-21 15:22
- 阅读:2040
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
HBuilderX类型: 正式
HBuilderX版本号: 4.12
手机系统: Android
手机系统版本号: Android 14
手机厂商: 魅族
手机机型: 20
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
无
无
实际结果:
无
无
bug描述:
app分片上传是一个很常见的需求,可是要在uniapp上面实现需求,真是举步维艰,我替广大开发者详细描述。
前提:上传到国内主流的OSS,七牛,阿里
1、首先通过plus.gallery.pick或者uni.chooseVideo两个API获取到的file文件,调用file.slice得到的chunk分片,其属性fullPath指向原文件,所以直接上传该chunk的话,其上传的是原文件。
所以只有两条路
2、先来看看第一条路:将该文件缓存到运行内存或者复制一份切片chunk存到沙盒目录
- 通过 plus.io.FileReader() 的 reader.readAsDataURL(chunk)方法获取到base64的切片base64chunk
- 将切片base64chunk通过uni.base64ToArrayBuffer转为ArrayBuffer对象
- 然后通过uni.request()上传二进制文件,此处无法使用uni.uploadFile和plus.uploader,因为不支持传二进制文件,所以没有很好的方式渲染上传进度
- 在安卓10以前的手机上,前面所述流程是能上传了。可是targetSdkVersion>=29的安卓10+,在第一步reader.readAsDataURL就报错了
- 自此我已放弃这条路了,后续只能将ArrayBuffer对象从运行缓存存到沙盒,然后读取该文件存的路径上传,传完后删除该片段,频繁的读写存储内存,很不友好
3、然后看看我预想的第二条路,通过嵌入一个本地HTML网页,通过H5的切片上传完成需求,这虽然能实现,但是这曲线救国的路线,想想也是可悲

我目前也遇到了这样的问题,主要问题是我感觉如果使用纯js似乎根本就无法实现所谓分片上传,并且网上也无法找到相关的博客去讲解这方面的问题,我目前是安卓分片上传实现了的,方法是通过uniapp的uts插件,去开发原生的方法,uts中可以直接通过import去引用原生api
import File from 'java.io.File'
import FileInputStream from 'java.io.FileInputStream'
import FileOutputStream from 'java.io.FileOutputStream'
这样的情况就好一点,也能通过使用uts的方法上传,不过ios我就不太懂了,虽然也能用ios,不过ios的uts编译很是,麻烦,每次更改uts后就需要重新编译基座,就很晕头转向的,而且我对于swift的代码也不是很懂,搞得更是开发艰难
总而言之,我是觉得依靠纯uniapp的js代码是无法实现分片的,以后有没有不知道,但是现在确实没发现,不知道有没有大佬知道办法,能否解决这个问题
rivenx
你好,我也遇到这个问题了,解决了么?有偿
2024-11-14 22:57
1***@163.com
回复 rivenx: 你好,解决了吗
2024-12-25 14:18
3***@qq.com
回复 1***@163.com: 你好,请问你解决这个问题了吗?
2025-03-07 16:43
未知城市
回复 3***@qq.com: 你好 请问你这个解决了吗 我也是遇到这个问题
2025-04-30 13:26
3***@qq.com
你好,问题解决了没
2025-05-17 15:01