解决Java文件上传下载图片(资源)追加byte,导致图片等文档只显示一半问题

这篇文章想了很久,没想到合适的标题。

另外本文讲的不是高深莫测的技术,而是在文件上传下载过程中可能会忽视的编码细节导致的程序 bug。

大型复杂的程序或分布式系统可能都存在一个专门的服务来提供文件的上传和下载,而一个 to B 的产品,还要在自有的产品功能基础上去适配第三方的程序。

因此,我们内部的文件服务,目前支持 fastdfs,minio,阿里云 oss,腾讯云 cos 等功能。这样一个文件的上传和下载就需要一道中转。

而我的同事,在中转文件时,产生了 bug,导致在预览下载图片时,图片感觉被截取了,只剩一半了。

下面我贴一下错误代码:

OutputStream out = response.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
    dos.write(buf);
}
dos.flush();

上面代码中的 dos.write(buf); 用法有误。

比如,我最后一次只读取到了 512 个 byte 数据。buf 数组的长度一共是 1024,后面有 512 个是没用的。这里直接调用 dos.write(buf); 就会多写入 512 个无用的数据。

最终就会导致图片的部分内容“丢失”,或显示成灰色。

解决Java文件上传下载图片(资源)追加byte,导致图片等文档只显示一半问题
图片显示一半示例

最终完整正确的代码如下所示:

OutputStream out = response.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
byte[] buf = new byte[1024];
int bytesRead;
while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
    //并不是每次都能读到1024个字节,所有用bytesRead作为每次读取数据的长度,否则会出现文件损坏的错误
    out.write(buf, 0, bytesRead);
}
dos.flush();

以上,希望能够帮助到更多人,避免跳坑!

解决Java文件上传下载图片(资源)追加byte,导致图片等文档只显示一半问题

: » 解决Java文件上传下载图片(资源)追加byte,导致图片等文档只显示一半问题

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/252276.html

(0)
上一篇 2022年5月4日
下一篇 2022年5月4日

相关推荐

发表回复

登录后才能评论