Skip to content

Commit eeb37cd

Browse files
🎨 #4057 修复 weixin-java-common 模块中 FileUtils.imageToBase64ByStream(InputStream) 对输入流读取不完整导致 Base64 结果被截断/污染的问题
1 parent c34ac4d commit eeb37cd

2 files changed

Lines changed: 29 additions & 4 deletions

File tree

weixin-java-common/src/main/java/me/chanjar/weixin/common/util/fs/FileUtils.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,10 @@ public static File createTmpFile(InputStream inputStream, String name, String ex
5757
* @return base64编码
5858
*/
5959
public static String imageToBase64ByStream(InputStream in) {
60-
byte[] data = null;
6160
// 读取图片字节数组
6261
try {
63-
data = new byte[in.available()];
64-
in.read(data);
6562
// 返回Base64编码过的字节数组字符串
66-
return Base64.getEncoder().encodeToString(data);
63+
return Base64.getEncoder().encodeToString(IOUtils.toByteArray(in));
6764
} catch (IOException e) {
6865
e.printStackTrace();
6966
} finally {

weixin-java-common/src/test/java/me/chanjar/weixin/common/util/fs/FileUtilsTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import java.io.ByteArrayInputStream;
77
import java.io.File;
88
import java.io.IOException;
9+
import java.io.InputStream;
910
import java.nio.charset.Charset;
1011
import java.nio.file.Files;
12+
import java.util.Base64;
1113
import java.util.List;
1214

1315
import static org.assertj.core.api.Assertions.assertThat;
@@ -30,5 +32,31 @@ public void testTestCreateTmpFile() {
3032

3133
@Test
3234
public void testImageToBase64ByStream() {
35+
byte[] original = new byte[5000];
36+
for (int i = 0; i < original.length; i++) {
37+
original[i] = (byte) (i % 256);
38+
}
39+
// A stream that returns at most 16 bytes per read() call (like a network stream),
40+
// so a single in.read(buffer) does not fill the buffer.
41+
InputStream chunked = new InputStream() {
42+
private final ByteArrayInputStream delegate = new ByteArrayInputStream(original);
43+
44+
@Override
45+
public int read() {
46+
return delegate.read();
47+
}
48+
49+
@Override
50+
public int read(byte[] b, int off, int len) {
51+
return delegate.read(b, off, Math.min(len, 16));
52+
}
53+
54+
@Override
55+
public int available() {
56+
return delegate.available();
57+
}
58+
};
59+
String result = FileUtils.imageToBase64ByStream(chunked);
60+
assertThat(result).isEqualTo(Base64.getEncoder().encodeToString(original));
3361
}
3462
}

0 commit comments

Comments
 (0)