mysql以blob存储图片文件的存储和读取问题解决

BLOB存储图片格式问题

因为项目需要存储网络上用户头像的信息,前面的文章也说过存储的方法,后来为了锻炼自己,就选择了以blob形式存储图片,而非图片路径。之前因为做的是一个网站的图像采集,存入数据库后,发现有一小部分出现了图片显示成不全,模糊等症状,如图:

因为所占部分比较少,只有2%左右,还处于可以接受的水平,而且当时为了开发功能,也就没有进行细致的研究。但结果就是针对另一个网站进行图像存取的时候,unbelievable事情发生了,截个图让大家见识一下:

这貌似就是shit,根本不符合开发的要求,当初还以为是另一个同志的读取数据库方法上有问题,要不怎么可能差距这么大。

仔细想了想,自己进行了测试,首先提取图片链接,使用inputstream和outputstream流结合fileoutputstream存取,发现所得图片全为正常,这说明,在获取的inputstream字节流是木有问题的。随后将字节流存入数据库的blob类型中,然后用同样的outputstream流,fileoutputstream接受保存本地图片,结果就成现在这个样子了。

就此,问题出现了,字节流写入数据库blob出现了问题。鉴于此问题的严重性,自己在网上寻找解决字节流写入数据库的其他方案,有byte[]数组方式,转化为String方式,ByteArrayStream字节流方式。但,因为个人实力有限,虽然找到了这些写入的方式,有的在inputstream转化byte[] 上出问题,有的不支持HttpStream流到byteArraySteam流的转化,String流还要更改数据库设计等问题,方法没有实现。

几次尝试的失败,于是动脑筋想了想有没有其它的解决方式呢,最后脑门一热,想到了既然httpStream流直接转化为inputstream是正常的,而转化为其它流文件则是问题,而inputstream字节流直接保存图片也没有问题,那为何不来个中转的方式,先将图片httpStream流变为变为相应文件暂存,稍后再用fileinputstream流取出,然后再写入数据库。

 URL myurl = new URL(imageUrl);   
            URLConnection myconn = myurl.openConnection();   
            in = myconn.getInputStream(); 
            //先写入到文件
            OutputStream myos = null;   
            try {   
                myos = (new FileOutputStream("[暂存]"+".jpg"));   
                byte[] buff = new byte[1024];   
                int num = 0;   
                while((num = in.read(buff))!= -1)   
                {   
                    myos.write(buff, 0, num);   
                    myos.flush();   
                }     
inputstream newin = new FileInputStream("[暂存].jpg");
}

经过上面的折腾,猛然发现,问题解决了,虽然最终为何会出现图片进入数据库后显示出现问题还没有找到答案,但目前的问题算是解决了,下面是显示正常的截图。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值