素材巴巴 > 程序开发 >

记录一个 BASE64图片转字节流图片显示不全的问题

程序开发 2023-09-12 06:59:04

      最近学习图片转字节流时遇到个问题,开始时毫无目的地摸索了些时间,最后结果实在是哭笑不得,在此记录下这次小错误,希望自己今后不再犯,也愿意与大家一起分享一下。

     起因是项目各个客户端需要从服务器取图片,从而实现图片信息共享的效果,于是我便用字节流进行客户端和服务器之间的传输,问题也就这样发生了,哈哈,先看代码

/*** 文件转字节流** @param imgSrc* @return* @throws IOException*/public static byte[] image2Bytes(String imgSrc) throws IOException {byte[] buffer;FileInputStream fin = new FileInputStream(new File(imgSrc));ByteArrayOutputStream baos = new ByteArrayOutputStream(fin.available());byte[] bytes = new byte[fin.available()];int temp;while ((temp = fin.read(bytes)) != -1) {baos.write(bytes, 0, temp);}//将文件内容写入字节数组fin.close();baos.close();buffer = baos.toByteArray();return buffer;}
 

这是我写的一个文件转字节流方法,下面调用

    byte[] b1 = FileInputUtil.image2Bytes(savePath);String imgStr = Base64Utils.encodeToString(b1);

然后就是通过url到服务器,字节流由base64编码后当参数传入。

下面是服务器接收字节流并再转为图片保存在服务器端,代码如下

String imgStr = StrUtil.trim(request.getParameter("imgstr"));if (imgStr != null && !("").equals(imgStr)) {//Base64解码byte[] b = Base64Utils.decodeFromString(imgStr);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {//调整异常数据b[i] += 256;}}// 如果指定保存文件的目录不存在,则需要创建String dir = serverImgUrl + ip;File file = new File(dir);if (!(file.exists() && file.isDirectory())) {file.mkdirs();}String savePath = dir + "\" + fileName;System.out.println("服务器保存路径" + savePath);FileInputUtil.buff2Image(b, savePath);
 

调用了我封装的字节流写出图片的方法,如下

public static void buff2Image(byte[] b, String tagSrc) throws Exception {FileOutputStream fout = new FileOutputStream(tagSrc);//将字节写入文件fout.write(b);fout.close();}

这时问题就出现了,来回试了好几下,在客户端存的图片好好的,到了服务器端就是显示不全,效果如下

客户端图

 

服务器端

 

就这样反复琢磨了一上午时间,突然想到是不是BASE64转码字节流传输时出现了了字节丢失,监听了一下字节长度,果然如此,搜索发现原来是字节传输时会将原来的“+”变为空格,找到了根本问题,事情就好解决了嘛,于是我在服务器端接收到到后,加了个小小的空格转“+”处理,轻松解决,代码处理如下

   //将服务器端base64转码后空格转换为+String s = imgStr.replaceAll(" ", "+");//Base64解码byte[] b = Base64Utils.decodeFromString(s);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {//调整异常数据b[i] += 256;}}

好啦,这就是我遇到的一个问题,虽然解决起来也简单,但是如果没想到问题出处,就像我一样无头苍蝇乱撞,还是挺浪费时间的,在此记录一下,也提醒自己不再犯,谢谢啦!


标签:

上一篇: eclipse项目导入教程 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。