uniapp 实现表单中包括上传附件

uniapp做的原生android开发,动态表单数据录入的时候有时候需要上传附件和拍照视频功能

1.进行android平台的判断

if (plus.os.name.toLowerCase() != "android") {
	uni.showModal({
		title: '提示',
		content: '仅支持Android平台',
		success: function(res) {}
	});
	return false
}

let main = plus.android.runtimeMainActivity();
let Intent = plus.android.importClass("android.content.Intent");
let fileIntent = new Intent(Intent.ACTION_GET_CONTENT)
fileIntent.setType("*/*"); //无类型限制
fileIntent.addCategory(Intent.CATEGORY_OPENABLE);
main.startActivityForResult(fileIntent, 1);
// 获取回调
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");
let MediaStore = plus.android.importClass("android.provider.MediaStore");
let contentResolver = main.getContentResolver()
plus.android.importClass(contentResolver);
// 返回路径
let path = '';
if (resultCode == Activity.RESULT_OK) {
	let uri = data.getData()
	if ("file" == uri.getScheme().toLowerCase()) { //使用第三方应用打开
		path = uri.getPath();
		return;
	}
	if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { //4.4以后
		path = getPath(this, uri);
	} else { //4.4以下下系统调用方法
		path = getRealPathFromURI(uri)
	}
	// 回调
	let arr = path.split('/')
	let fileName = arr[arr.length - 1]
	that.files.push({
		path: path,
		name: fileName
	})
}
// 4.4 以上 从Uri 获取文件绝对路径
function getPath(context, uri) {
	let isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
	let scheme = uri.getScheme().toLowerCase()
	if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
		/if (isExternalStorageDocument(uri)) {
			let docId = DocumentsContract.getDocumentId(uri);
			let split = docId.split(":");
			let type = split[0];
			// 如果是手机内部存储
			if ("primary" == type.toLowerCase()) {
				return Environment.getExternalStorageDirectory() + "/" + split[1];
			} else {
				return '/storage/' + type + "/" + split[1];
			}
		}
		// DownloadsProvider
		else if (isDownloadsDocument(uri)) {
				let id = DocumentsContract.getDocumentId(uri);
				let split = id.split(":");
				return split[1]
		}
		// MediaProvider
		else if (isMediaDocument(uri)) {
			let docId = DocumentsContract.getDocumentId(uri);
			let split = docId.split(":");
			let type = split[0];
			let contentUri = null;
			if ("image" == type.toLowerCase()) {
				contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
			} else if ("video" == type.toLowerCase()) {
					contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
			} else if ("audio" == type.toLowerCase()) {
					contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
			}
			let selection = "_id=?";
			let selectionArgs = [split[1]];
			return getDataColumn(context, contentUri, selection, selectionArgs);
		}
	}
	// MediaStore (and general)
	else if ("content" == scheme) {
			return getDataColumn(context, uri, null, null);
	}
	// File
	else if ("file" == scheme) {
		return uri.getPath();
	}
}
// 4.4 以下 获取 绝对路径
function getRealPathFromURI(uri) {
	let res = null
	let proj = [MediaStore.Images.Media.DATA]
	let cursor = contentResolver.query(uri, proj, null, null, null);
	if (null != cursor && cursor.moveToFirst()) {
		let column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		res = cursor.getString(column_index);
		cursor.close();
	}
	return res;
}

// 通过uri 查找出绝对路径
function getDataColumn(context, uri, selection, selectionArgs) {
	let cursor = null;
	let column = "_data";
	let projection = [column];
	cursor = contentResolver.query(uri, projection, selection, selectionArgs, null);
	if (cursor != null && cursor.moveToFirst()) {
		let column_index = cursor.getColumnIndexOrThrow(column);
		return cursor.getString(column_index);
	}
}

function isExternalStorageDocument(uri) {
		return "com.android.externalstorage.documents" == uri.getAuthority() ? true : false
}

function isDownloadsDocument(uri) {
		return "com.android.providers.downloads.documents" == uri.getAuthority() ? true : false
}
function isMediaDocument(uri) {
		return "com.android.providers.media.documents" == uri.getAuthority() ? true : false
}

转化base64

handControllGetBase64(file, callback) {
//h5不可用
uni.saveFile({
	tempFilePath: file,
	success: (saveFile) => {
		//pathToBase64为uniapp 插件市场的插件内方法
		pathToBase64(saveFile.savedFilePath).then(base64 => {
			//用完就删
			uni.removeSavedFile({
				filePath: saveFile.savedFilePath
			});
			//返回
			callback(base64);
		})
	},
	fail: (err) => {
		console.log(err)
	}
});
},

附件的预览

// 附件预览
previewFile(obj) {
	let that = this
	let path = ''
	if (obj.path) {
		uni.openDocument({
			filePath: obj.path,
			success(res) {},
			fail(res) {
				uni.showToast({
					title: '无法打开的文件类型'
				})
			}
		})
	} else {
		let path = ''
		let url = ‘xxx’
		uni.downloadFile({
			url: url,
			header: {
				'Content-Type': 'application/json',
				'Accept': 'application/json',
				'charset': 'UTF-8'
			},
			success: function(res) {
				if (res.statusCode == 200) {
					path = res.tempFilePath;
					uni.openDocument({
						filePath: path,
						success(res) {},
						fail(res) {
							uni.showToast({
								title: '无法打开的文件类型',
								icon: 'none'
							})
						}
					})
				} else {
					uni.showToast({
						title: '下载附件失败',
						icon: 'none'
					})
				}
			}
		})
	}
},
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐