公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
这篇文章想了很久,没想到合适的标题。
另外本文讲的不是高深莫测的技术,而是在文件上传下载过程中可能会忽视的编码细节导致的程序 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 个无用的数据。
最终就会导致图片的部分内容“丢失”,或显示成灰色。
最终完整正确的代码如下所示:
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();
以上,希望能够帮助到更多人,避免跳坑!
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 解决Java文件上传下载图片(资源)追加byte,导致图片等文档只显示一半问题