在我们前端和服务器通信时,常常会存在一下文件传输,我在用Android前端和Myeclipse服务器进行图片传输时,常常是把图片的地址存在数据库,再通过这个地址去get图片,在Android前端  我们传输图片 常常是 将Bitmap转换为Bytes

public static byte[] Bitmap2Bytes(Bitmap bm) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
}
但由于传输时长度太长,所以通常用Base64将Bytes转换为String字符串进行传输

public static String Bitmap2String(Bitmap bitmap)
{
    return Base64.encodeToString(Bitmap2Bytes(bitmap), Base64.DEFAULT);
}
   到服务器端  我犯了一个严重的错误,将传送上来的String字符串直接用 byte[] b = str.getbyte();的方式将字符串转换为字节流,然后将图片存在服务器本地

File imageFile = new File("G:\\Tomcat\\apache-tomcat-9.0.2\\webapps\\FleaMarket\\Image\\"+type);  
            if(!imageFile.exists())
                imageFile.mkdirs();
                //创建输出流  
            FileOutputStream outStream = new FileOutputStream(imageFile.getPath()+"\\"+uid+sdf.format(d)+".png");  
                //写入数据  
            outStream.write(bitmapArray);  
                //关闭输出流  
            outStream.close(); 
这样存储后

在本地文件夹打开后看到的图片是默认图片,而且怎么都打不开

或者打开后是黑乎乎的一片

这不是电脑照片查看的问题,而是照片编码出错问题,虽然在电脑上打不开,但是同样能在Android进行解码然后变成Byitmap

问题的关键就是 我们在Android端用Base64编码后的字符串不能直接转化为bytes流而是要通过Base的方式转换为正常的字节流

byte[] b= decoder.decodeBuffer(str);取代 byte[] b = str.getbyte();

下面是正确解码并保存在服务器本地能查看

public static String SaveImage(String str,int uid,String type)
    {
        //获取时间
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        
        BASE64Decoder decoder = new BASE64Decoder();
    
        try
        {
            byte[] bitmapArray= decoder.decodeBuffer(str);
            for(int i=0;i<bitmapArray.length;++i)
            {
                if(bitmapArray[i]<0){
                    bitmapArray[i]+=256;
                }
            }
            
            
            File imageFile = new File("G:\\Tomcat\\apache-tomcat-9.0.2\\webapps\\FleaMarket\\Image\\"+type);  
            if(!imageFile.exists())
                imageFile.mkdirs();
                //创建输出流  
            FileOutputStream outStream = new FileOutputStream(imageFile.getPath()+"\\"+uid+sdf.format(d)+".png");  
                //写入数据  
            outStream.write(bitmapArray);  
                //关闭输出流  
            outStream.close();    
            return "Image/"+type+"/"+uid+sdf.format(d)+".png";
        }
        catch(IOException e)
        {
            System.out.println(e);
        }
        return null;
    }
这样在服务器就能正确查看了

虽然在电脑上能不能看见,只要能在Android上解码就可以了,但是如果用其他没有Bitmap的前端来get这张图片就会出错比如c# winform来获取这张照片在pictureBox上就显示不出来,因为他获取的就会是我们用str.getbytes转错的字节流,他就不能转回正确的图片编码了。
--------------------- 
作者:飞娃扑火 
来源:CSDN 
原文:https://blog.csdn.net/m0_37655297/article/details/80031243 
版权声明:本文为博主原创文章,转载请附上博文链接!

Java 保存String流图片为bytes不能在本地打开,照片出错的问题相关推荐

  1. Chrome保存的知乎网页,本地打开后闪频刷新问题处理

    Chrome保存的知乎网页,本地打开后闪频刷新问题处理 问题描述: 系统:Window 10 浏览器: Chrome Chrome保存的知乎网页后,在本地打开出现闪频刷新的问题. 原因分析: 分析网页 ...

  2. java 字符流图片_java 字节流、字符流(复制图片、复制文本)

    1.File 1)构造方法 2)创建 3)判断.获取 4)删除 2.字节流 1)字节流写数据的3种方式 FileOutputStream fos = new FileOutputStream(&quo ...

  3. 精通java图片_面试必备:详解Java I/O流,掌握这些就可以说精通了?

    Java IO概述 IO就是输入/输出.Java IO类库基于抽象基础类InputStream和OutputStream构建了一套I/O体系,主要解决从数据源读入数据和将数据写入到目的地问题.我们把数 ...

  4. JAVA 通过url下载图片保存到本地(亲测)

    //java 通过url下载图片保存到本地    public static void download(String urlString, int i) throws Exception {     ...

  5. Java 字节数组流之图片转成字节数组

    Java 字节数组流之图片转成字节数组,相当于图片的复制 字符串可以直接读取到字节数组中用(getBytes) 问题:将一张图片读到字节数组里面(所有的东西都能够读到字节数组里面) 思路:先使用文件输 ...

  6. 【FFmpeg】java实现利用ffmpeg视频上传转码同时截取一帧保存为同名图片,并获取视频分辨率

    〇.前情提要 完成了视频上传,接下来是给上传的视频保存一张同名的jpg文件在同样文件夹中,并且获取到视频的分辨率. macOS Catalina 10.15.1 ffmpeg version 4.3. ...

  7. JAVA上传文件图片到服务器保存

    这里我记录一个比较简单方便操作的JAVA上传文件图片到服务器并且保存! 首先是页面 html的   我这是提交一个文件和类型 <div style="border: 1px solid ...

  8. java保存当前页面为图片大小_java用BufferedImage转换图片大小并保存

    java用BufferedImage转换图片大小并保存,保存的图片总是一片黑色 程序实现将一个图片缩小成256*256像素图片并保存,源图片为jpg格式,但是每次转换后存在文件夹中的文件均为一片黑色, ...

  9. java上传文件图片到服务器保存,Java上传文件图片到服务器的方法

    这里我记录一个比较简单方便操作的java上传文件图片到服务器并且保存,具体内容如下 首先是页面html的   我这是提交一个文件和类型 我是添加一张临时图片得到微信的media_id保存数据库! en ...

最新文章

  1. 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)
  2. word2vec安装以及使用
  3. mysql开启事务_MySQL入门之事务(上)
  4. python学习笔记(四)字典(dict)
  5. Jupyter notebook: TypeError: __init__() got an unexpected keyword argument 'io_loop 问题
  6. Workbox-Window v4.x 中文版
  7. 实例化Java对象_Java面向对象基础之对象实例化
  8. Oracle11 startup报错,oracle11g 启动报错 缺少系统参数
  9. js实现关于分页的一种实现方式
  10. python 脚本所在目录,Python 获取当前所在目录的方法详解
  11. Spring Cloud实战(六)-Spring Cloud Netflix Bus
  12. 项目系统架构-微服务框架
  13. 尝试在UE的材质节点中进行高斯模糊
  14. 阿里数据分析师面试准备二:对阿里数据分析师岗位的理解
  15. 爬取各个高校自主招生名单
  16. GOOGLE卫星地图 计算方式
  17. android小动画之Running Pig
  18. 图像处理冷知识——dpi和ppi
  19. Java XML教程
  20. RACTuple分析

热门文章

  1. Dobot机械臂 Arduino二次开发详细教程
  2. 有道云-markdown使用(流程图)
  3. 设计UI - Adobe xd文本和钢笔
  4. ppt打开提示以安全模式启动失败
  5. E3 1200 系列服务器,另类的Xeon E3-1200 v4:我们都误会它了!
  6. 摄像头录像 及视频保存压缩
  7. 宾馆房间C++一解:宾馆里有一百个房间,从1-100编了号。第一个服务员把所有的房间门都打开,第二个服务员把所有编号是2的倍数的房间相反处理……以后每个服务员都是如此。共100个服务员哪几扇门是打开的
  8. 英语口语练习系列-C14-常用片语
  9. 公派访问学者签证申请需提交的材料
  10. 在什么特殊情况下延长劳动者工作时间可不受限制