uniapp-上传图片、上传视频

本文详细介绍了如何在uniapp中利用chooseImage和chooseVideo API选择并上传图片和视频,包括代码示例及上传失败处理。展示了选择图片和视频的流程,并提到了uni.chooseMedia的整合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于 uniapp 的应用上传图片/视频 资源的实现:

功能涉及的主要 uniapp API 如下:

1.选择图片uni.chooseImage(OBJECT) | uni-app官网

2.选择视频uni.chooseVideo(OBJECT) | uni-app官网

3.上传文件uni.uploadFile(OBJECT) | uni-app官网

下面分别贴出示例代码:

上传图片

        // 上传图片
		async chooseImages() {
			uni.showLoading({
				mask: true,
				title: '上传中...'
			})
			// uploadFile 存储需要上传的文件
			let uploadFile = ''
			// 1.选择图片(这里只能单选)
			const res = await uni.chooseImage({
				count: 1,	// 最多可以选择的图片张数,默认9
				// sizeType: ['compressed'],		// original 原图,compressed 压缩图,默认二者都有
				sourceType: ['album'],		// album 从相册选图,camera 使用相机,默认二者都有。如需直接开相机或直接选相册,请只使用一个选项
			});
			// console.log('res:', res);
			if(res.length < 2) {		// 小于2则没有选择图片
				uni.hideLoading()
				return
			}
			uploadFile = res[1].tempFilePaths[0];	// 拿到选择的文件
			var that1 = this;
			// 2.将选择的图片上传到目标服务器
			const arr = await uni.uploadFile({
				// 需要上传的地址
				url: that1.vuex_uploadAction,
				// filePath  需要上传的文件
				filePath: uploadFile,
				name: 'file',
				timeout: 2000,		// 超时时间
				header: {		// HTTP 请求 Header, header 中不能设置 Referer。
					token: that1.vuex_token		// 挂载请求头为用户的 token
				},
			});
			// console.log(arr);
			let data = JSON.parse(arr[1].data)
			console.log('data:', data);
			if(data.code !== 1) {	// 图片上传失败了
				uni.hideLoading()
				that1.$u.toast(data.msg)
				return
			}
			// 上传成功(把上传成功后的文件路径 push 到页面需要显示的图片数据列表中)
			that1.fileList.push(data.data.fullurl)
			that1.formData.photo_url.push(data.data.url)
			// console.log(that1.fileList);
			uni.hideLoading()
		},

注:示例代码已封装为一个方法,可直接调用,需要自定义之处可自行参照 API 文档修改,比如从相册选图还是打开相机拍照、可上传的图片数量等

上传视频

        // 上传视频
		async chooseVideo() {
			uni.showLoading({
				mask: true,
				title: '上传中...'
			})
			// uploadFile 存储需要上传的文件
			let uploadFile = ''
			// 1.选择要上传的视频
			const res = await uni.chooseVideo({
				maxDuration: 60,		// 拍摄视频最长拍摄时间,单位秒。最长支持 60 秒。
				sourceType: ['album'],		// album 从相册选视频,camera 使用相机拍摄,默认为:['album', 'camera']
			});
			uploadFile = res[1].tempFilePath;
			// console.log(uploadFile);
			var that2 = this;
			// 2.上传所选视频到服务器
			const arr = await uni.uploadFile({
				// 需要上传的地址
				url: that2.vuex_uploadAction,
				// filePath  需要上传的文件
				filePath: uploadFile,
				name: 'file',
				header: {
					token: that2.vuex_token		// 挂载请求头为用户的 token
				},
			});
			let data = JSON.parse(arr[1].data)
			console.log('data:', data);
			if(data.code !== 1) {		// 视频上传失败了
				uni.hideLoading()
				that1.$u.toast(data.msg)
				return
			}
			// 上传成功(把上传成功后的文件路径 push 到页面需要显示的视频数据列表中)
			that2.uploadVideoUrl = data.data.fullurl
			that2.formData.video_url = data.data.url
			uni.hideLoading()
		}

扩展

uniapp 还整合提供了上传媒体文件(图片/视频)的 API: uni.chooseMedia 可用于上传图片和视频。若有兴趣可自行打开链接测试使用。

<think>嗯,用户想在UniApp中使用uni-file-picker实现图片上传的功能,需要一份使用指南和示例代码。首先,我得回忆一下uni-file-picker组件的相关文档。记得这个组件是官方封装好的,底层用了uni.chooseImage、uni.previewImage和uni.uploadFile这几个API。用户可能对这些底层API不太熟悉,所以直接使用uni-file-picker会更方便。 接下来,我需要确保回答的结构清晰,分步骤说明。首先应该介绍基本用法,包括如何引入组件、配置相关属性,比如file-extname来限制文件类型,mode设置上传模式(列表或网格)。然后提供一个简单的示例代码,展示模板部分和数据方法部分,特别是@success事件的处理,这里可能需要说明如何获取上传后的文件信息。 然后,用户可能需要上传到自己的服务器,而不仅仅是uniCloud。这时候要提到修改upload-url属性,并处理before-upload事件,可能涉及添加请求头如token。同时要注意跨域问题,需要服务器支持CORS。这部分可能需要示例代码,展示如何配置before-upload来添加自定义参数。 另外,引用中提到的注意事项也很重要,比如安卓的视频大小限制、临时路径持久化需要调用uni.saveFile,以及权限检查。这些应该在注意事项部分逐一列出,帮助用户避免常见问题。比如,提醒用户检查相册和摄像头权限,使用uni.authorize或uni.getSetting来处理权限问题。 还有,用户可能想知道上传后的文件如何处理,比如持久化保存或者上传到CDN。这时候需要提到uni.saveFile和uniCloud.uploadFile,特别是推荐使用uniCloud的优势,比如免费CDN和易用性。可能还需要提到uni-file-picker已经集成上传到uniCloud的功能,方便用户直接使用。 需要检查是否覆盖了用户可能遇到的问题,比如文件类型限制、上传数量、自定义样式等。如果有高级用法,比如自定义样式,可以简要说明如何通过slot扩展,但可能不需要深入,除非用户明确要求。 最后,相关问题部分要生成与uni-file-picker相关的问题,比如优化上传、处理大文件、权限问题、与uniCloud的整合,以及自定义样式。这些问题应该覆盖用户可能进一步探索的方向,帮助他们深入使用组件。 需要确保所有提到的API和属性名称正确,比如file-extname是否正确,事件名称如@success和before-upload是否正确拼写。同时,代码示例中的标签是否正确,比如<uni-file-picker>的属性是否正确使用。还要注意引用对应的参考文献,比如引用[1]、[2]、[3]中的内容,确保信息准确。 可能还需要提醒用户注意版本兼容性,确保他们使用的UniApp和uni-ui版本支持这些功能。如果有常见的错误,比如图片上传失败,可以建议检查网络、服务器配置或权限问题。但用户的问题主要集中在使用指南上,所以可能不需要深入调试部分,除非用户后续提问。 总之,回答需要步骤明确,代码示例简洁,注意事项全面,并且引用相关文档,确保用户能够顺利实现图片上传功能,同时了解可能遇到的坑和解决方法。</think>### UniApp uni-file-picker 图片上传使用指南 #### 一、基本用法 1. **组件引入** 确保已安装并注册`uni-file-picker`组件(需通过HBuilderX导入`uni-ui`扩展库)。 2. **属性配置** - `file-extname`:指定允许上传图片类型,如`file-extname="jpg,png"` - `mode`:设置显示模式(`list`列表模式或`grid`网格模式) - `limit`:限制最大上传数量 3. **示例代码** ```html <uni-file-picker v-model="fileList" mode="grid" file-extname="jpg,png" :limit="5" @success="uploadSuccess" @fail="uploadFail" ></uni-file-picker> ``` ```javascript export default { data() { return { fileList: [] } }, methods: { uploadSuccess(e) { console.log('上传成功:', e.tempFilePaths); // 上传到服务器的逻辑可在此处补充 }, uploadFail(err) { console.error('上传失败:', err); } } } ``` #### 二、上传到自定义服务器 1. **配置上传地址** 设置`upload-url`属性指向服务器接口: ```html <uni-file-picker upload-url="https://your-api.com/upload" @before-upload="beforeUpload" ></uni-file-picker> ``` 2. **添加请求头** 通过`before-upload`事件添加认证信息: ```javascript methods: { beforeUpload(files) { return new Promise((resolve) => { files.header = { 'Authorization': 'Bearer token' }; resolve(files); }); } } ``` *注意:需确保服务器配置了CORS跨域支持[^3]* #### 三、注意事项 1. **临时路径处理** App端获取的临时路径需调用`uni.saveFile`持久化存储[^2] 2. **文件大小限制** Android视频上传默认限制180MB,大文件需使用原生插件[^2] 3. **权限检查** 使用前应检查相册/摄像头权限: ```javascript uni.getSetting({ success(res) { if (!res.authSetting['scope.album']) { uni.authorize({ scope: 'scope.album' }) } } }) ``` #### 四、完整流程示例 ```html <template> <view> <uni-file-picker v-model="files" mode="list" :auto-upload="false" @select="handleSelect" ></uni-file-picker> <button @click="submit">提交到服务器</button> </view> </template> <script> export default { data() { return { files: [] } }, methods: { handleSelect(files) { this.tempFiles = files.tempFiles }, async submit() { const uploadTasks = this.tempFiles.map(file => uni.uploadFile({ url: 'your-api-url', filePath: file.path, name: 'file' }) ); await Promise.all(uploadTasks); uni.showToast({ title: '全部上传成功' }); } } } </script> ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值