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

 

钻研不易,转载请注明出处。。。。。。

 

 

 

 

posted @   莫小龙  阅读(1862)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示