使用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
相关产品推荐
相关产品推荐

