Base64 编码器截断返回的 Sting

Base64 encoder truncates returned Sting

提问人:glez 提问时间:9/22/2023 最后编辑:glez 更新时间:9/24/2023 访问量:84

问:

我使用数据 src URL 在 HTML img 标签中显示图像文件,该 URL 包含编码格式的 64 字节图像数据。

当我从编码的字节中获取字符串时,它终止到应该大约 100k 的少数字符。我有一个滚动你自己的编码例程,我从某个地方举起它,它工作正常,尽管速度很慢。

该文件来自多部分编码表单的帖子。我使用 Apache Commons 的 FileItem 来解析已发布的字段。文件内容在那里定义为 String,但它包含二进制数据。如果我使用自己的编码器,它可以在相同的数据上正常工作。我还使用相同的字符串将文件上传到 AWS S3,它在那里工作正常。我尝试绕过字符串,如果我将文件的 InputStream 传递给 Base64.encode(),我会得到同样的错误。对返回的编码字符串的检查显示其被严重截断。

下面是包含图像的变量。我还尝试传递输入流进行编码并获得相同的结果。我试过了.也试过了.fileStringencode().toString()encodeToString()new String(bytes, “UTF-8”)

我不明白为什么要截断返回的 ASCII 字符串。任何帮助将不胜感激。Base64.encodeToString

使用 Java 和 JSP。

String thumbUrl = "data:image/jpeg;base64," +  Base64.getEncoder().encodeToString(file.getBytes());

<img style="width:200px;" src="<%= thumbUrl %>" />

更新:代码和输出以演示问题。

byte[] temp = fileParam.value.getBytes();
System.out.println("input len: " + temp.length);
                
temp = Base64.getEncoder().encode(temp);
System.out.println("enc len: " + temp.length);

String z = new String(temp);
System.out.println("z string len: " + z.length());

System.out.println("enc string len: " + temp.toString().length());
                
String myEncString = NetHelper.encodeBase64(fileParam.value);
System.out.println("my encoder string len: " + myEncString.length());


Output:

input len: 3493
enc len: 4660
z string len: 4660  <<< GOOD string length.  Doesn't render
enc string len: 10  <<< BAD string returned
my encoder string len: 4660
字符串 base64 被截断

评论

0赞 Todd 9/22/2023
它是否只“截断”了一两个字符?我看到的 Base64 编码最常见的问题是末尾的填充字符。有些代码/系统添加填充字符,有些则不需要,有些需要填充字符,有些不需要。我会先检查一下。
0赞 glez 9/22/2023
不,它截断了很多。我添加了一些代码来显示问题以及我自己的编码器如何正常工作。
0赞 glez 9/23/2023
而不是 toString(),它截断它几乎有效。字符串 z = new String(temp);

答:

0赞 Hryhorii Popov 9/22/2023 #1

格列兹,

问题似乎不在于字节编码。

你提到

下面是包含图像的变量。fileString

您是否检查是否正确加载了文件?

通常,在 Java 中加载二进制文件时不会得到内容。
你如何加载它?你检查过这个字符串的长度吗?
String

评论

0赞 glez 9/22/2023
同意,是的,我已经检查过了。我在问题中添加了更多信息。
0赞 glez 9/24/2023 #2

我发现new String(bytes)返回正确的长度字符串。我得到了一个完整的字符串,但它没有正确呈现,所以还有其他事情发生。也许 Base64.toString() 中有一个错误会截断返回的字符串。