如何将 S3ObjectInputStream 转换为 Base64url?

How to convert S3ObjectInputStream to Base64 url?

我在 AWS S3 bucket 中有一个 png 图像文件。我正在尝试使用 Java SDK 获取此图像。到目前为止,这是我所做的:

public String encodeBase64URL(BufferedImage imgBuf) throws IOException {
    String base64;

    if (imgBuf == null) {
        base64 = null;
    } else {
        Base64 encoder = new Base64();
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        ImageIO.write(imgBuf, "PNG", out);

        byte[] bytes = out.toByteArray();
        base64 = "data:image/png;base64," + encoder.encode(bytes)
                .toString();
    }

    return base64;
}

public String saveImageToS3(BufferedImage imgBuf, String id) throws IOException {
    AmazonS3 s3 = new AmazonS3Client();

    File file = File.createTempFile(id, ".png");
    file.deleteOnExit();

    ImageIO.write(imgBuf, "png", file);

    s3.putObject(new PutObjectRequest(bucketName, id, file));
    file.delete();

    return bucketName;
}

public String downloadImageFromS3(String id) throws IOException {
    AmazonS3 s3 = new AmazonS3Client();

    S3Object obj = s3.getObject(new GetObjectRequest(bucketName, id));
    BufferedImage imgBuf = ImageIO.read(obj.getObjectContent());

    String base64 = encodeBase64URL(imgBuf);
    return base64;
}

saveImageToS3 方法完全符合预期。但是,第二种方法 returns data:image/png;base64,[B@428d24fa 虽然它应该是有效的 Base64.

我做错了什么?请帮忙。

与其在生成的 byte[] 上调用 toString() 这将导致非常无用的 [B@428d24fa 格式,不如创建一个新的 String 使用返回的字节:

base64 = "data:image/png;base64," + new String(encoder.encode(bytes), "UTF-8");

我在使用 Base64 encoder = new Base64(); 时遇到了一些问题 所以我通过不使用编码器解决了这个问题,并且我在任何地方都用 Base64.getEncoder() 替换了“encoder”。

示例:-

if (img == null) {

    base64 = null;

} else {

    ByteArrayOutputStream out = new ByteArrayOutputStream();

    ImageIO.write(img,"PNG",out);

    byte bytes[] = out.toByteArray();

    base64 = new String(Base64.getEncoder().encode(bytes),"UTF-8");
}