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

使用S3预签名URL上传Base64图片异常:文件为文本而非二进制

问题分析与解决办法

你遇到的核心问题是上传时直接发送了Base64字符串文本,而非解码后的二进制图片数据,同时预签名URL的配置存在冗余,导致S3将内容识别为文本文件。

1. 调整预签名URL生成代码(Lambda JavaScript)

移除ContentEncoding: "base64"配置,该参数用于告知S3上传内容是Base64编码格式,但我们最终要上传的是二进制图片,无需这个编码声明:

const signedUrlExpireSeconds = 60 * 100;
var url = s3.getSignedUrl("putObject", {
  Bucket: process.env.ScreenshotBucket,
  Key: s3Key,
  ContentType: "image/jpeg",
  Expires: signedUrlExpireSeconds,
});

2. 修改Java上传代码

将Base64字符串解码为字节数组,以二进制形式上传,同时移除Content-Encoding请求头:

// 将Base64字符串解码为二进制字节数组
byte[] imageBytes = Base64.getDecoder().decode(body);

HttpRequest request = HttpRequest.newBuilder()
        .PUT(HttpRequest.BodyPublishers.ofByteArray(imageBytes))
        .header("Content-Type", "image/jpeg")
        .uri(URI.create(url))
        .build();

HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());

if (response.statusCode() != 200) {
    throw new Exception(response.body());
}

关键说明:

  • 原代码用ofString(body)发送Base64文本,S3会直接存储字符串内容,无法识别为图片。
  • 解码后用ofByteArray发送二进制数据,配合正确的Content-Type,S3会将内容识别为图片文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:06:28