You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lambda处理Base64图片转文件上传Supabase后文件损坏问题排查

问题分析与修复方案

核心错误点

1. Lambda返回的Base64字符串被额外JSON转义

你的Lambda函数中,返回的是JSON.stringify(Buffer.from(buffer).toString('base64')),这会让响应内容变成带双引号的字符串(例如"abc123...")。客户端拿到这个字符串后,直接使用会包含多余的双引号,导致Base64解码失败,生成损坏的图片文件。

2. 客户端错误使用URL处理函数转换Base64

urltoFile函数是用于从URL获取文件内容的,但你传入的是纯Base64字符串,并非合法URL(比如data:image/png;base64,...格式的Data URL)。调用fetch处理纯Base64字符串会导致无法正确获取数据,最终生成无效文件。

修复步骤

步骤1:修正Lambda函数的返回格式

不要直接对Base64字符串做JSON.stringify,而是返回包含Base64字段的JSON对象,确保客户端能正确解析出纯净的Base64内容:

const Sharp = require("sharp");
const height = 150;
const width = 150;

// 补充sendResponse函数实现(原代码遗漏)
function sendResponse(statusCode, body, callback) {
  const response = {
    statusCode: statusCode,
    headers: {
      "Content-Type": "application/json",
      "Access-Control-Allow-Origin": "*" // 根据实际需求配置跨域
    },
    body: body
  };
  callback(null, response);
}

exports.handler = (event, context, callback) => {
  let request = JSON.parse(event.body);
  let base64String = request.base64String;
  base64String = base64String.split(';base64,').pop();
  let inputBuffer = Buffer.from(base64String, 'base64');
  
  Sharp(inputBuffer)
    .resize(width, height)
    .toFormat("png")
    .toBuffer()
    .then(buffer => {
      // 返回包含base64字段的JSON对象
      sendResponse(200, JSON.stringify({ base64: buffer.toString('base64') }), callback);
    })
    .catch(err => {
      sendResponse(500, JSON.stringify({ error: err.message }), callback);
    });
};

步骤2:替换客户端的文件转换逻辑

使用Base64直接转File的函数,替代原有的urltoFile:

// 直接将Base64字符串转换为File对象
function base64ToFile(base64String, filename, mimeType) {
  // 解码Base64字符串
  const byteChars = atob(base64String);
  const byteArrays = [];
  
  // 分块处理字节数据
  for (let offset = 0; offset < byteChars.length; offset += 512) {
    const slice = byteChars.slice(offset, offset + 512);
    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }
    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }
  
  return new File(byteArrays, filename, { type: mimeType });
}

// 调用转换函数生成文件
const imageFileForUpload = base64ToFile(res.data.base64, 'test.png', 'image/png');

验证逻辑

  1. Lambda处理后返回的JSON对象中,base64字段是纯净的Base64字符串(无额外引号);
  2. 客户端通过base64ToFile直接将Base64解码为字节数组,生成合法的PNG文件;
  3. 上传至Supabase后,下载即可正常打开。

内容的提问来源于stack exchange,提问作者Ripas55

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:36:20