经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Vue.js » 查看文章
uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内(推荐)
来源:jb51  时间:2022/11/17 8:48:47  对本文有异议

我在做uniapp项目时,用的uni-file-picker组件,这是我做的一个项目实例,主要是将图片通过接口传至后台服务器

如果只是上传一张照片的话 还没有什么大问题,但是如果一连上传很多个图片,像我这个项目一样,而且有的图片特别大,我这边遇到一个上传照相机的照片就有10兆多,有的手机内存不足,临时空间不够,就会出现白屏的情况。

解决方法:

一、先开启uni-file-picker组件里对于压缩图片的配置项 sizeType,默认是有两个选项的:

  • original :正常
  • compressed:压缩

这是组件源码里显示传参的参考:

  1. sizeType: {
  2. type: Array,
  3. default () {
  4. return ['original', 'compressed']
  5. }
  6. },

所以在调用uni-file-picker组件时,就可以进行设置,如下:

  1. <uni-file-picker v-model="mentouValue" return-type="object"
  2. fileMediatype="image" mode="grid" :sourceType="sourceType"
  3. :sizeType="sizeType" :auto-upload="false"
  4. @select="mentouSelect" @delete="mentouDelete"/>

 :sizeType="sizeType" 表示的是压缩图片的设置
data中设置sizeType的值:

  1. export default {
  2. data() {
  3. return{
  4. mentouValue:{}, //图片value值
  5. sizeType:['compressed'], //设置图片压缩
  6. sourceType:['camera'], //这里设置的是只能使用照相机,不能从相册里传照片
  7. }
  8. },
  9. }

通过以上设置,可以实现对图片进行压缩 一般是对半压缩的,比如5兆压缩成2.5兆左右这样的。
如何进行检验:本地是检验不出来的,需要拿手机进行真机调试,才可以看出来文件压缩后的大小

如果对图片大小没有太大限制 ,直接这样压缩就可以了,但是有的项目会限制对图片的大小必须小于1兆,这时候,光有这个设置,就满足不了需求了,这时候我们可以再采取一点措施

二、将图片再次进行压缩,压缩至1兆以下,再传至服务器中:

      1、先创建一个方法imageCompress,一般单独放在公共函数里

  1. // 图片压缩递归,小于1M跳出
  2. export function imageCompress(file){
  3. return new Promise((resolve, reject)=>{
  4. let { size,path } = file
  5. let type = path.split(".")[1]
  6. //大于1M进行压缩,
  7. if(size< (1024*1024)){
  8. resolve(file)
  9. return false
  10. }
  11. uni.compressImage({
  12. src: path,
  13. quality: 80,
  14. success: res => {
  15. let newPath = res.tempFilePath+type
  16. let newName = res.tempFilePath.split("/")[res.tempFilePath.split("/").length-1]+type
  17. uni.getFileInfo({
  18. filePath:res.tempFilePath,
  19. success:async (info)=>{
  20. let newFile = {...file,size:info.size,path:newPath,name:newName,tempFilePath:res.tempFilePath}
  21. resolve(await imageCompress(newFile))
  22. }
  23. })
  24. }
  25. })
  26. })
  27. }

  2、调用uni-file-picker组件的页面中,调用该方法,然后再上传图片

  1. import { imageCompress } from "@/utils/index.js"
  2. import { baseUrl } from "@/utils/request"
  3. export default {
  4. data() {
  5. return{
  6. mentouValue:{}, //图片value值
  7. sizeType:['compressed'], //设置图片压缩
  8. sourceType:['camera'], //这里设置的是只能使用照相机,不能从相册里传照片
  9. file:{},
  10. type:''
  11. workId:''
  12. }
  13. },
  14. onLoad(option) {
  15. this.workId = option.workId
  16. },
  17. methods:{
  18. //选择照片
  19. mentouSelect(e){
  20. this.timeSeting()
  21. if(e.tempFilePaths&&e.tempFiles){
  22. this.file = e.tempFiles[0].file
  23. this.type = 'mentou'
  24. this.toUpload()
  25. }
  26. },
  27. // 删除照片
  28. mentouDelete(e){
  29. this.mentouValue = {}
  30. },
  31. // 上传照片
  32. async toUpload(){
  33. // 压缩图片
  34. this.file = await imageCompress(this.file)
  35. // 要传的参数
  36. let params = {
  37. file:this.file,
  38. type: this.type,
  39. workId:this.workId
  40. }
  41. // 上传图片到相依的接口
  42. uni.uploadFile({
  43. url: baseUrl+'/app/uploadImage', //这里为拼接的接口地址
  44. filePath: this.file.tempFilePath?this.file.tempFilePath:this.file.path,
  45. fileType: "image",
  46. formData:{...params},
  47. name: 'file',
  48. header: {
  49. 'content-type': 'multipart/form-data',
  50. "Authorization": uni.getStorageSync('Authorization'),
  51. "refToken": uni.getStorageSync('refToken')
  52. },
  53. success: uploadFileRes => {
  54. let imageName = JSON.parse(uploadFileRes.data).data
  55. // 这里可以对返回的参数进行处理了
  56. uni.showToast({ title: '上传成功', icon: "success" });
  57. },
  58. fail(err) {
  59. uni.showToast({ title: '上传失败', icon: "error" });
  60. }
  61. })
  62. },
  63. }
  64. }

这样写完后,图片就会被压缩至1兆以下,然后再传给后端了,亲测有效哦

到此这篇关于uniapp组件uni-file-picker中对上传的图片进行压缩至1兆以内的文章就介绍到这了,更多相关uniapp压缩图片上传内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号