Browse Source

二维码错误处理

jiayubo 2 days ago
parent
commit
dc753c894e
3 changed files with 19 additions and 4 deletions
  1. 1 1
      api/qrcode.js
  2. 11 2
      components/QRCode/index.vue
  3. 7 1
      utils/qrcode.js

+ 1 - 1
api/qrcode.js

@@ -26,6 +26,6 @@ export function getUnlimitedQRCode(data = {}) {
       page:'pages/login',
       scene: data.scene || `${userType}:${userId}`, // 同样使用本地存储的值生成 scene
     },
-    // responseType: 'arraybuffer', // 设置响应类型为arraybuffer,因为返回的是图片二进制内容
+    responseType: 'arraybuffer', // 设置响应类型为arraybuffer,因为返回的是图片二进制内容
   })
 } 

+ 11 - 2
components/QRCode/index.vue

@@ -64,8 +64,17 @@ const generateQRCode = async () => {
       referrerType: userType,
       referrerId: userId,
     })
-    // 拼接Base64图片前缀
-    qrCodeUrl.value = 'data:image/jpeg;base64,' + response.data
+    
+    // 处理返回的二进制数据
+    if (response.data instanceof ArrayBuffer) {
+      // 使用arrayBufferToBase64转换二进制数据为base64
+      const base64Data = uni.arrayBufferToBase64(response.data)
+      // 拼接Base64图片前缀
+      qrCodeUrl.value = 'data:image/png;base64,' + base64Data
+    } else {
+      // 如果返回的不是ArrayBuffer,使用原有逻辑
+      qrCodeUrl.value = 'data:image/jpeg;base64,' + response.data
+    }
   } catch (error) {
     console.error('生成二维码失败:', error)
     uni.showToast({

+ 7 - 1
utils/qrcode.js

@@ -18,8 +18,14 @@ export const saveQRCodeToLocal = async (base64) => {
     const fsm = uni.getFileSystemManager();
     const filePath = `${uni.env.USER_DATA_PATH}/qrcode_${Date.now()}.png`;
     
+    // 移除Base64数据的前缀(如data:image/jpeg;base64,)
+    let base64Data = base64;
+    if (base64Data.includes('base64,')) {
+      base64Data = base64Data.split('base64,')[1];
+    }
+    
     // 写入文件
-    fsm.writeFileSync(filePath, base64, 'base64');
+    fsm.writeFileSync(filePath, base64Data, 'base64');
     
     // 保存到相册
     await uni.saveImageToPhotosAlbum({