uniapp(安卓)之文件上传
uniapp(安卓)之文件上传
uniapp提供的uni.chooseFile只支持H5和微信小程序,所以想上传除图片/视频外的非媒体文件,需要使用原生的方式开发。
uploadtxdr() {
//使用plus选择文件 let that = this; let filePath = '' let main = plus.android.runtimeMainActivity(); let Intent = plus.android.importClass('android.content.Intent'); let Activity = plus.android.importClass('android.app.Activity'); 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'); var MediaStore = plus.android.importClass('android.provider.MediaStore'); // 给系统导入 contentResolver let contentResolver = main.getContentResolver(); plus.android.importClass(contentResolver); if (resultCode == Activity.RESULT_OK) { // 解析路径 if (data.getData() != null) { let uri = data.getData() let path = uri.getPath() // 获取到选择文件的虚拟路径 let docId = DocumentsContract.getDocumentId(uri); let split = docId.split(":"); let type = split[0]; let selection = "_id=?"; let selectionArgs = new Array(); selectionArgs[0] = split[1]; uri = MediaStore.Files.getContentUri("external"); plus.android.importClass(main.getContentResolver()); // 通过查询的方式用虚拟路径的id1获取到文件的真实路径 let cursor = main.getContentResolver().query(uri, ['_data'], selection, selectionArgs, null); plus.android.importClass(cursor); if (cursor != null && cursor.moveToFirst()) { let column_index = cursor.getColumnIndexOrThrow('_data'); console.log(column_index) let result = cursor.getString(column_index) // result即文件的真实路径 cursor.close(); } // 从真实路径中提取文件信息 console.log('file://' + result) plus.io.resolveLocalFileSystemURL('file://' + result, (entry) => { entry.file((file) => { // file 对象即为所需的文件对象 console.log("文件对象:", file); // 可以在这里进行后续操作 }, (error) => { console.log("获取文件对象出现异常", error); }); }, (error) => { console.log("解析本地文件路径出现异常", error); }); } } } },
后续发现可以使用plus.io.chooseFile直接获取虚拟路径,然后再通过路径转化获取文件信息。
let fileTypes = ['xls', 'zip']; // 允许的文件类型 let chooseFile = plus.io.chooseFile({ title: '选择文件', filetypes: fileTypes, multiple: false // 是否允许多选 }, (e) => { console.log(e) console.log(e.files[0]) }); },
获取文件真实路径是为了文件信息回显,文件上传使用 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 => {} })
参考链接:
https://blog.csdn.net/weixin_43048846/article/details/132834101
https://blog.csdn.net/weixin_44523517/article/details/131580335
钻研不易,转载请注明出处。。。。。。