我们知道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 => {}
})