当前位置:   article > 正文

uniapp微信小程序 图片&文件上传并且支持图片和文件预览(pdf等文件预览)巨细教学!_uniapp图片上传的组件

uniapp图片上传的组件

首先呢,小程序打开pdf等文件有下面几种办法:

  1. 用微信自带的wx.downloadFile() + wx.openDocument()
  2. 使用web-view,uni-app中webview可以直接加载pdf文件
  3. 可以使用网上说的pdf.js去实现(我没有用到这个,就不介绍了)

网上查到很多资料显示安卓是可以通过上面第一种办法,但是ios用第一个方法打不开,网上、社区确实有这个说法,但是貌似bug被修复了,我经过测试现在安卓和ios都可以打开。

如果大家遇到了这样的bug,那可以安卓使用方法1,苹果使用webview的方式打开文件

我上传文件使用的是uni-ui的上传组件:

这里要提一个bug就是说,这个组件设置v-model 后上传文件后,按道理再去读取这个v-model的值就应该是之前上传的文件数据,但是打印后并没有数据,而只有在点击删除文件后,再读取v-model才会有值,这个bug在社区很早就有人提出了,所以我采用通过监听select事件去手动存储文件数据,然后对应delete事件也删除数组中对应的文件数据。其次因为我项目中的需求是点击文件名字预览,那么文件的展示是手写的,组件原本的文件展示我用display:none隐藏掉了。

  1. <view style="width: 70%;margin: 0 auto;margin-bottom: 20rpx;">
  2. <uni-file-picker v-model="fileList" title="最多选择9个文件" :list-styles="styleObject" :sourceType="['album', 'camera']"
  3. file-mediatype="all" ref="files" :limit="11" :auto-upload="false" @select="select" @success="success"
  4. @fail="fail" @progress="progress" @delete="deleteFile">
  5. <view class="clickBtn">点击选择文件</view>
  6. </uni-file-picker>
  7. </view>
  8. <view style="width: 70%;margin: 0 auto;margin-bottom: 20rpx;" v-for="(item, index) in ajaxFileList" :key="index">
  9. <view class="flex justify-start align-center">
  10. <view class="fileBox" @click="Preview(item)">{{ item.name }}</view>
  11. <view class="delBox" @click="delFile(index)">删除</view>
  12. </view>
  13. </view>
  1. // 获取上传状态
  2. select(e) {
  3. console.log('选择文件:', e)
  4. e.tempFiles.forEach(item => {
  5. this.ajaxFileList.push({//用一个变量单独存储上传的文件数据
  6. name: item.cloudPath,
  7. extname: item.extname,
  8. url: item.path,
  9. })
  10. });
  11. console.log(this.ajaxFileList);
  12. },
  13. deleteFile(e) {
  14. console.log('删除文件:', e)
  15. this.ajaxFileList.forEach((item, index) => {
  16. if (e.tempFilePath === item.path) {
  17. this.ajaxFileList.splice(index, 1)
  18. }
  19. })
  20. console.log(this.ajaxFileList);
  21. },
  22. // 上传成功
  23. success(e) {
  24. console.log('上传成功')
  25. },
  26. // 上传失败
  27. fail(e) {
  28. console.log('上传失败:', e)
  29. },
  30. // 获取上传进度
  31. progress(e) {
  32. console.log('上传进度:', e)
  33. },
  34. Preview(item) {//用正则去识别不同文件类型,然后对应不同文件类型去做不同操作
  35. console.log(item);
  36. // 定义图片类型的正则表达式
  37. const imageRegex = /(\.jpg|\.jpeg|\.png)$/i;
  38. // 定义文档类型的正则表达式
  39. const docRegex = /(\.doc|\.docx|\.pdf)$/i;
  40. // 定义其他文件类型的正则表达式
  41. const othersRegex = /(\.txt|\.csv|\.xlsx)$/i;
  42. // 利用正则表达式判断文件类型
  43. if (imageRegex.test(item.name)) {
  44. console.log("图片类型");
  45. this.lookImage(item.url)
  46. } else if (docRegex.test(item.name)) {
  47. console.log("文档类型");
  48. this.lookFile(item.url)
  49. } else if (othersRegex.test(item.name)) {
  50. console.log("其他文件类型");
  51. } else {
  52. uni.showToast({
  53. title: `未知文件类型`,
  54. icon: 'none',
  55. duration: 2000
  56. })
  57. }
  58. },
  59. delFile(index) {
  60. console.log(index);
  61. this.ajaxFileList.splice(index, 1)
  62. },
  63. lookImage(url) {
  64. let imgArray = [];
  65. imgArray[0] = url
  66. uni.previewImage({
  67. current: 0,
  68. urls: imgArray
  69. })
  70. },
  71. lookFile(url) {
  72. uni.openDocument({
  73. filePath: url,
  74. success: function (res) {
  75. console.log("打开文档成功");
  76. },
  77. fail: function (res) {
  78. console.log("uni.openDocument,fail");
  79. console.log(res)
  80. },
  81. complete: function (res) {
  82. console.log("uni.openDocument,complete");
  83. console.log(res)
  84. }
  85. });
  86. },

如果大家的文件是https或者http的线上资源:

  1. uni.downloadFile({
  2. url: url,
  3. success: function (res) {
  4. var filePath = res.tempFilePath;
  5. console.log("下载文件:",res);
  6. uni.openDocument({
  7. filePath: filePath,
  8. success: function (res) {
  9. console.log("打开文档成功");
  10. },
  11. fail: function (res) {
  12. console.log("uni.openDocument,fail");
  13. console.log(res)
  14. },
  15. complete: function (res) {
  16. console.log("uni.openDocument,complete");
  17. console.log(res)
  18. }
  19. });
  20. },
  21. fail: function (res) {
  22. console.log('uni.downloadFile,fail')
  23. console.log(res)
  24. },
  25. complete: function (res) {
  26. console.log('uni.downloadFile,complete')
  27. console.log(res)
  28. }},
  29. );

我本次遇到的需求是单图预览、文件上传时候支持预览文件,

如果出现uni.openDocument安卓能打开,ios打不卡id情况那么就看下面的文章

https://blog.csdn.net/weixin_38673922/article/details/128626373

https://blog.csdn.net/liuxiaocaie/article/details/125874472

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/556508
推荐阅读