From eeb37cd3ea7e9c3cb3a4d4a1db725a2fcf00f373 Mon Sep 17 00:00:00 2001 From: Vasiliy Mikhailov Date: Fri, 10 Jul 2026 17:26:22 +0300 Subject: [PATCH] =?UTF-8?q?:art:=20#4057=20=E4=BF=AE=E5=A4=8D=20weixin-jav?= =?UTF-8?q?a-common=20=E6=A8=A1=E5=9D=97=E4=B8=AD=20FileUtils.imageToBase6?= =?UTF-8?q?4ByStream(InputStream)=20=E5=AF=B9=E8=BE=93=E5=85=A5=E6=B5=81?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E4=B8=8D=E5=AE=8C=E6=95=B4=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=20Base64=20=E7=BB=93=E6=9E=9C=E8=A2=AB=E6=88=AA=E6=96=AD/?= =?UTF-8?q?=E6=B1=A1=E6=9F=93=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin/common/util/fs/FileUtils.java | 5 +--- .../weixin/common/util/fs/FileUtilsTest.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java index 4a267153c..8419c87d5 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java @@ -57,13 +57,10 @@ public class FileUtils { * @return base64编码 */ public static String imageToBase64ByStream(InputStream in) { - byte[] data = null; // 读取图片字节数组 try { - data = new byte[in.available()]; - in.read(data); // 返回Base64编码过的字节数组字符串 - return Base64.getEncoder().encodeToString(data); + return Base64.getEncoder().encodeToString(IOUtils.toByteArray(in)); } catch (IOException e) { e.printStackTrace(); } finally { diff --git a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/fs/FileUtilsTest.java b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/fs/FileUtilsTest.java index 5a25fb149..3ab603e47 100644 --- a/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/fs/FileUtilsTest.java +++ b/weixin-java-common/src/test/java/me/chanjar/weixin/common/util/fs/FileUtilsTest.java @@ -6,8 +6,10 @@ import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.Charset; import java.nio.file.Files; +import java.util.Base64; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -30,5 +32,31 @@ public class FileUtilsTest { @Test public void testImageToBase64ByStream() { + byte[] original = new byte[5000]; + for (int i = 0; i < original.length; i++) { + original[i] = (byte) (i % 256); + } + // A stream that returns at most 16 bytes per read() call (like a network stream), + // so a single in.read(buffer) does not fill the buffer. + InputStream chunked = new InputStream() { + private final ByteArrayInputStream delegate = new ByteArrayInputStream(original); + + @Override + public int read() { + return delegate.read(); + } + + @Override + public int read(byte[] b, int off, int len) { + return delegate.read(b, off, Math.min(len, 16)); + } + + @Override + public int available() { + return delegate.available(); + } + }; + String result = FileUtils.imageToBase64ByStream(chunked); + assertThat(result).isEqualTo(Base64.getEncoder().encodeToString(original)); } }