uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务 ...

打印 上一主题 下一主题

主题 826|帖子 826|积分 2478

前言



  • 最近在利用uni-app写H5移动端,有一个从手机拍摄从相册选择获取图片上传到文档服务器功能。
  • 查阅uni-app发现关于上传图片,uni-file-picker文件上传,uni.chooseImage,uni.uploadFile
  • H5上传时它和pc端原理差不多,都是file对象上传,PC端是通过new file对象,uni-app是直接提供了
  • 微信小程序上传时是需要微信提供的临时路径,uni-app是直接提供了
  • 留意H5上传和微信小程序uni.uploadFile()上传参数是不一样的二者不能共存,留意看注释
自己理解

1.uni.chooseImage是uni-app提供调用手机拍摄从相册选择获取图片的api
2.uni-file-picker文件上传是uni-app封装上传图片和文件的组件,它包含uni.chooseImage这个api
3.uni.uploadFile()是uni-app为了弥补原生uni.request缺陷,可以直接写文挡服务器地址
4.uni.uploadFile()在H5上传和微信小程序上传时参数不一样不能共存-留意看文档下面有解说
5.uni-file-picker文件上传默认是我们有上传空间uniCloud,以是属性中没有设置上传属性
6.至于什么是上传空间uni-app在创建项目时有选择,没有上传空间借助uni.uploadFile()上传文档服务器
7.最终我们用uni-file-picker文件上传(包含uni.chooseImage)+ uni.uploadFile()就可以实现这个功能
留意点

1.如果uni-app项目是没有上传空间的化,uni-file-picker文件上传这几个事件是不会触发的




2.uni.chooseImage-api返回值-留意H5上传和微信小程序上传参数不一样
H5上传时-文档写的是tempFiles就是一个File对象,直接把这个内里0项当参数大概会报错
微信小程序上传时-直接取临时路径即可
  1. // h5上传-需要文件file对象
  2. const tempFilePaths = e.tempFiles[0].file;
  3. // 微信小程序上传-需要微信临时提供临时地址
  4. const tempFilePaths = e.tempFilePaths;
复制代码



3.uni.uploadFile()发送哀求时
3.1uni.uploadFile()发送哀求时会根据是在H5情况还是微信情况配置参数不一样(不能并存)


3.2它会跟axios一样会在外面帮我们包一层data,取值时间需要多写一个data(res.data.data)
3.2它的返回结果时一个json格式字符串,需要转换成js对象,不转换值是灰色并且取不出来


4.uni-file-picker文件上传,通过:value="fileLists"回显时间需要留意必须要有3个值

5.文档和许多文档都说没有上传空间时间需要手动上传,其实不消专门写个按钮利用手动上传
5.1手动上传只是获取图片一样在点击按钮时间,在上传,没有实质性作用,不消专门写手动上传
5.2就算我们没有绑定上传空间,也不消手动上传直接选择图片它就会触发@select="select" 配合uni.uploadFile()上传即可

6.结果图
 



代码实现

1.在form表单中-uni-forms编写上传组件代码-uni-forms
title不写的化右边 0/9 上传图片限制不会出现
  1. <uni-forms-item label="">
  2.     <uni-file-picker limit="9" :value="fileLists" title="维修单据"                                 :image-styles="imageStyles"
  3.        :sourceType="sourceType" @select="select"                                                 @progress="progress" @success="success"
  4.         @fail="fail" @delete="deletea" />
  5. </uni-forms-item>
复制代码
2.data中变量
  1. // 图片回显
  2. fileLists: [],
  3. // 上传图片的样式
  4. imageStyles: {
  5.         width: 90,
  6.         height: 90,
  7.         },
  8. // uni.chooseImage值,从相册选择,拍摄
  9. sourceType: ['album', 'camera'],
复制代码
3.method事件-留意H5上传和微信小程序上传只能存在一个参数不一样-留意看注释
  1. // 获取上传状态
  2.             select(e) {
  3.                 console.log('选择文件:', e)
  4.                 // 解决file对象取值问题
  5.                 // h5上传-需要文件file对象
  6.                                 // const tempFilePaths = e.tempFiles[0].file;
  7.                                 // 微信小程序上传-需要微信临时提供临时地址
  8.                                 const tempFilePaths = e.tempFilePaths;
  9.                 uni.uploadFile({
  10.                     url: '文档服务器地址',
  11.                     // 要上传文件对象-h5和微信小程序上传参数不一样只能存在一个
  12.                     // H5上传
  13.                                         // file: tempFilePaths,
  14.                                         // 微信小程序上传
  15.                                         filePath: tempFilePaths[0],
  16.                     //文件对应的 key , 开发者在服务器端通过这个 key 可以获取到文件二进制内容
  17.                     name: 'file',
  18.                     // 请求头设置
  19.                     // 我们是需要token和用户id登录时存从uni-app数据存储中取
  20.                     header: {
  21.                         "token": uni.getStorageSync('token'),
  22.                         "tenant-id": uni.getStorageSync('tenant-id')
  23.                     },
  24.                    // 成功函数
  25.                     success: (res) => {
  26.                         // uni.uploadFile默认在外面包了一层data
  27.                         console.log('上传成功', res.data);
  28.                 // uni.uploadFile返回来的结果默认是JSON格式字符串,需要用JSON.parse转换成js对象
  29.                        console.log('上传数据转换',JSON.parse(res.data));
  30.                         // 取到文档服务器的值
  31.                         let uploaddata = JSON.parse(res.data)
  32.                         let x = {}
  33.                         // 下面3个值是uni-app规定的一个不能少
  34.                         x.url = uploaddata.url
  35.                         x.extname = ''
  36.                         x.name = uploaddata.filename
  37.                         this.fileLists.push(x)
  38.                     },
  39.                     // 失败提示用户重新上传
  40.                     fail: error => {
  41.                         console.log('失败', error);
  42.                     }
  43.                 })
  44.             },
  45.             // 获取上传进度
  46.             progress(e) {
  47.                 // 没有上传空间,不会执行
  48.                 console.log('上传进度:', e)
  49.             },
  50.             // 上传成功
  51.             success(e) {
  52.                 // 没有上传空间,不会执行
  53.                 console.log('上传成功')
  54.             },
  55.             // 上传失败
  56.             fail(e) {
  57.                 // 没有上传空间,不会执行
  58.                 console.log('上传失败:', e)
  59.             },
  60.             // 删除
  61.             deletea(e) {
  62.                 console.log('删除图片', e);
  63.             },
复制代码

总结:这是试过了乐成的,不要直接复制一步一步来,出了问题一步一步看,不要急,不要给误导了。

经过这一趟流程下来相信你也对 uni-app uni-file-picker文件上传实现拍摄从相册选择获取图片上传文档服务器(H5上传-微信小程序上传) 有了初步的深刻印象,但在现实开发中我 们碰到的情况肯定是不一样的,以是我们要理解它的原理,万变不离其宗。加油,打工人!

   什么不敷的地方请各人指出谢谢 -- 風过无痕

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

飞不高

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表