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
钻研不易,转载请注明出处。。。。。。

浙公网安备 33010602011771号