uniapp之app开发选择本地文件上传至服务器

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

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值