如何封装微信小步伐中的图片上传功能

打印 上一主题 下一主题

主题 836|帖子 836|积分 2508


前言

在微信小步伐开发中,图片上传功能是一个非经常见的需求,不管是社交分享、商城中的商品图片上传,还是在线报修、问诊等应用场景,上传图片都可以或许提拔用户体验。而在实际项目中,我们经常需要对上传图片的逻辑进行封装,使得代码更加简便、易于复用。本文将具体先容如何封装微信小步伐中的图片上传功能,帮助开发者构建一个易扩展、易维护的上传模块。

一、需求分析与设计思绪

在开发一个图片上传功能时,我们需要关注以下几个方面:
  1. •        多张图片上传:是否允许用户同时选择和上传多张图片?
  2. •        文件校验:需要限制图片的格式和大小,避免用户上传不支持的格式或过大的图片文件。
  3. •        错误处理:如何优雅地处理上传失败或文件选择失败的情况,提升用户体验。
  4. •        模块化封装:为了提高代码的复用性,我们希望将上传逻辑封装成一个函数,能够灵活配置上传路径、表单数据等。
复制代码
基于这些需求,我们决定对微信小步伐的 wx.chooseMedia 和 wx.uploadFile API 进行封装,使得调用逻辑更加简便,并且处置处罚了常见的文件校验和错误处置处罚。
二、上传图片功能封装

下面是我们对微信小步伐图片上传功能的封装代码。它允许上传多张图片,包含文件格式和大小的校验,并处置处罚了上传和文件选择过程中的错误。
  1. import { BASE_URL, prefix } from "./config";
  2. // 限制文件大小为 5MB
  3. const MAX_FILE_SIZE = 5 * 1024 * 1024;
  4. /**
  5. * 校验图片格式
  6. * @param {string} filePath - 选择的文件路径
  7. * @returns {boolean} - 是否通过格式校验
  8. */
  9. function validateImageType(filePath: string): boolean {
  10.   const validFormats = ['jpg', 'jpeg', 'png'];
  11.   const fileExtension = filePath.split('.').pop()?.toLowerCase();
  12.   return validFormats.includes(fileExtension || '');
  13. }
  14. /**
  15. * 校验图片大小
  16. * @param {number} fileSize - 文件大小
  17. * @returns {boolean} - 是否通过大小校验
  18. */
  19. function validateImageSize(fileSize: number): boolean {
  20.   return fileSize <= MAX_FILE_SIZE;
  21. }
  22. /**
  23. * 上传图片到服务器
  24. * @param formData - 额外的表单数据,默认为空对象
  25. * @param count - 上传的图片数量,默认为 1
  26. * @returns 返回一个 Promise,resolve 成功结果,reject 错误信息
  27. */
  28. export function uploadImages(formData: object = {}, count: number = 1): Promise<any> {
  29.   return new Promise((resolve, reject) => {
  30.     // 选择照片
  31.     wx.chooseMedia({
  32.       count: count, // 用户可选择多张图片
  33.       mediaType: ["image"],
  34.       sourceType: ["album", "camera"],
  35.       success: (chooseMediaRes) => {
  36.         const tempFiles = chooseMediaRes.tempFiles;
  37.         // 校验文件格式和大小
  38.         for (const file of tempFiles) {
  39.           if (!validateImageType(file.tempFilePath)) {
  40.             return reject(new Error("不支持的图片格式,仅支持 JPG, JPEG, PNG 格式"));
  41.           }
  42.           if (!validateImageSize(file.size)) {
  43.             return reject(new Error(`图片大小不能超过 ${MAX_FILE_SIZE / 1024 / 1024}MB`));
  44.           }
  45.         }
  46.         // 批量上传图片
  47.         const uploadPromises = tempFiles.map((file) => {
  48.           return new Promise((uploadResolve, uploadReject) => {
  49.             wx.uploadFile({
  50.               url: `${BASE_URL}${prefix}/upload`, // 上传接口地址
  51.               filePath: file.tempFilePath,
  52.               name: "file", // 文件对应的 key
  53.               formData: formData, // 传递额外的表单数据
  54.               success: (uploadRes) => {
  55.                 try {
  56.                   const data = JSON.parse(uploadRes.data); // 解析服务器返回的 JSON 数据
  57.                   uploadResolve(data); // 上传成功,返回解析的数据
  58.                 } catch (error) {
  59.                   uploadReject(new Error("解析服务器返回的数据失败")); // 解析失败的错误处理
  60.                 }
  61.               },
  62.               fail: (err) => {
  63.                 uploadReject(new Error("上传照片失败")); // 上传失败的错误处理
  64.               },
  65.             });
  66.           });
  67.         });
  68.         // 等待所有上传请求完成
  69.         Promise.all(uploadPromises)
  70.           .then(resolve)
  71.           .catch(reject);
  72.       },
  73.       fail: (err) => {
  74.         reject(new Error("选择照片失败"));
  75.       },
  76.     });
  77.   });
  78. }
复制代码
功能解析
  1. 1.        文件格式校验:我们定义了一个 validateImageType 函数,用于确保用户上传的文件是 JPG、JPEG、PNG 格式。
  2. 2.        文件大小校验:通过 validateImageSize 函数,限制用户上传图片的大小不超过 5MB。
  3. 3.        多张图片上传:通过传递 count 参数,我们支持用户一次选择多张图片,并且批量上传到服务器。
  4. 4.        错误处理:我们捕获了图片选择、上传、以及服务器响应中的错误,并在失败时返回详细的错误信息。
复制代码
三、页面调用示例

下面是如何在小步伐的页面中调用这个封装好的图片上传功能:
  1. import { uploadImages } from './upload';
  2. Page({
  3.   data: {},
  4.   async onUpload() {
  5.     try {
  6.       const formData = { userId: '123456' }; // 附加的表单数据
  7.       const response = await uploadImages(formData, 3); // 上传最多3张图片
  8.       console.log('上传成功:', response);
  9.     } catch (error) {
  10.       console.error('上传失败:', error.message);
  11.     }
  12.   }
  13. });
复制代码
调用解析
  1. •        uploadImages(formData, count):我们通过调用 uploadImages 方法,传递表单数据(如用户 ID)以及允许用户选择上传最多3张图片。整个上传过程是异步的,调用者可以通过 try/catch 块捕获上传过程中可能发生的错误。
复制代码
四、功能改进与扩展

虽然该功能已经可以满意基础的图片上传需求,但我们可以根据具体业务场景进行扩展与优化:
4.1 压缩图片

如果用户上传的图片尺寸较大,我们可以在上传之前调用微信小步伐的 wx.compressImage 接口对图片进行压缩,以镌汰文件体积,提高上传速度。
  1. wx.compressImage({
  2.   src: file.tempFilePath, // 图片路径
  3.   quality: 80, // 压缩质量,0 ~ 100
  4.   success: (res) => {
  5.     // 将压缩后的图片路径用于上传
  6.   }
  7. });
复制代码
4.2 上传进度

通过 wx.uploadFile 提供的 onProgressUpdate 事件,我们可以及时获取文件上传的进度并展示给用户,提拔用户体验。
  1. wx.uploadFile({
  2.   ...,
  3.   onProgressUpdate: (progress) => {
  4.     console.log('上传进度:', progress.progress);
  5.   }
  6. });
复制代码
4.3 重试机制

如果图片上传失败,我们可以增长重试机制,比方在上传失败后自动重新上传图片,大概提示用户手动重新上传。
五、总结

通过封装微信小步伐的图片上传功能,我们不仅简化了代码的编写,还增长了文件格式和大小校验、错误处置处罚等功能,极大提拔了代码的复用性与可维护性。这种封装方式实用于任何涉及图片上传的场景,方便在项目中随时调用,并且根据实际需求可以扩展到视频上传、音频上传等其他文件上传场景。

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

老婆出轨

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

标签云

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