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

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

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

/**
     * 文件转字节流
     *
     * @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图片转字节流图片显示不全的问题_第1张图片

服务器端

 

就这样反复琢磨了一上午时间,突然想到是不是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;
                }
            }

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

你可能感兴趣的:(JAVA,IO流,java)