uniapp(安卓)之文件上传
uniapp(安卓)之文件上传
uniapp提供的uni.chooseFile只支持H5和微信小程序,所以想上传除图片/视频外的非媒体文件,需要使用原生的方式开发。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | uploadtxdr() {<br> //使用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直接获取虚拟路径,然后再通过路径转化获取文件信息。
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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
钻研不易,转载请注明出处。。。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通