赞
踩
我们知道uniapp在针对图片、视频这类文件有专门的API提供,这只是对于H5、小程序,而对于app而言,当选择文件特别是非图片等文件时似乎是力不从心。
最近的项目也是争对app android端关于文件上传时做了一下记录,希望对大家有所帮助
代码仍结合uniapp提供的uni.uploadFile()以及HTML5+开发者联盟所提供的技术实现,现记录一下实现过程中遇到的坑:
1、使用uni.request(),由于android端选择的文件通过不断的解析后是:/storage/emulated/0/Download/jiuguan0001.mp3 这种路径,因此uni.request()在解析时出错,不知道后端是如何处理这样的文件的
2、使用 new XMLHttpRequest() 测试发现文件存在跨域问题,找了很多方法仍然无果,决定放弃
3、使用uniapp插件市场提供的插件web-view,发现不够理想,修改后虽然可以用但达不到想要的效果
本文只是针对android 端其它端未测试,如有帮助可以参考
具体实现如下:
一、选择本地文件:(注意有的android机权限没有打开,需要打开权限,否则上传失败)
- let that = this;
- let filePath = ''
- let url = uni.$u.http.config.baseURL // 根域名地址
- let main = plus.android.runtimeMainActivity();
- let Intent = plus.android.importClass('android.content.Intent');
- let intent = new Intent(Intent.ACTION_GET_CONTENT);
- intent.setType('*/*');
- intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); //关键!多选参数
- intent.addCategory(Intent.CATEGORY_OPENABLE);
- main.startActivityForResult(intent, 200);
- // 获取回调
- main.onActivityResult = function(requestCode, resultCode, data) {
- let Activity = plus.android.importClass('android.app.Activity');
- let ContentUris = plus.android.importClass('android.content.ContentUris');
- let Cursor = plus.android.importClass('android.database.Cursor');
- let Uri = plus.android.importClass('android.net.Uri');
- let Build = plus.android.importClass('android.os.Build');
- let Environment = plus.android.importClass('android.os.Environment');
- let DocumentsContract =
- plus.android.importClass('android.provider.DocumentsContract');
-
- // 给系统导入 contentResolver
- let contentResolver = main.getContentResolver();
- plus.android.importClass(contentResolver);
- // 返回路径
- let path = '';
- if(resultCode == Activity.RESULT_OK){
- // 解析路径
- if(data.getData() != null){
- let uri = data.getData()
- //this 当前mainClass实例
- path = getPath(this, uri)
- that.filePath = path
- }
-
- }
- }
二、使用uni.uploadFile(),经过测试可以上传
- uni.uploadFile({
- url: url + '/index/uploadFile', // 上传地址
- methods: "POST",
- name: 'file',
- filePath:that.filePath, // 本地路径
- // formData: formdata,
- header: {
- 'content-type': 'application/x-www-form-urlencoded; charset=UTF-8'
- },
- success: res => {
- // console.log("res--->",res)
- uni.hideLoading()
- let result = JSON.parse(res.data).data // 上传成功后的地址链接
- uni.showLoading({
- title:'开始AI合成'
- })
- // 根据项目需求,自行删除
- //拿到链接进行下一步处理
- uni.$u.http.post('/index/sync_audio',{
- id:id,
- url:result.url
- }).then(res => {
- // console.log("upload--->",res)
- if (res.data.code == 1) {
- uni.hideLoading()
- uni.$u.toast("上传成功")
- setTimeout(function() {
- let pages = getCurrentPages()
- let currentPage = pages[pages.length-1]
- // console.log("currentPage---->",currentPage)
- currentPage.$vm.$refs.paging.reload() // 刷新当前 列表
- }, 1200)
- } else {
- uni.hideLoading()
- uni.$u.toast(res.data.msg)
- }
- }).catch( err =>{
- uni.hideLoading()
- uni.$u.toast('生成失败')
- })
- },
- fail: res => {
- uni.hideLoading()
- uni.showToast({
- title: "文件上传失败"
- })
- },
- complete: res => {}
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。