jsp上传图片的二进制数据到服务器,并显示服务器传的二进制数据
好处:不需要图片服务器,不需要处理文件夹、文件是否存在、重复等问题
参考:https://blog.****.net/Mr_yczhang/article/details/45478603
1、上传时
后台使用@RequestParam("**") MultipartFile myfile接收
2、数据库存储
image blob, //字段类型使用blob
3、后台接收处理
@RequestMapping(value = "/soft/create", method = { RequestMethod.POST,
RequestMethod.GET })
public ModelAndView create(ModelMap model,
@RequestParam MultipartFile myfile, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 图片转成二进制 将二进制存入数据库
//实体类中封装文件的byte[]数据(好像就是二进制流信息)
se.setSoftImage(myfile.getBytes());
//服务器调动mapper层,然后插入到数据库中
softService.insert(se);
return search(model, se, request, response);
}
4、页面展示
//跟其他图片链接地址一样,直接给个链接地址
<img src="${pageContext.request.contextPath}/user/showImage.do?index=${status.index}"
//发现:其他正常保存服务器的图片想显示,也是先读流,再写出即可;
byte[]数据,可以直接省略读操作,一点一点写出即可
5、响应部分,由上面分析就会简单
byte[] bb = list.get(index).getSoftImage(); //从数据库获取当前byte[]数据
// 禁止图像缓存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/png"); //响应的图片类型,根据实际情况决定具体值
//如果后台只保存二进制数据应该不行,至少还要有文件名(包含后缀)的信息
// 将图像输出到Servlet输出流中。
ServletOutputStream sos = response.getOutputStream();
sos.write(bb, 0, bb.length); //这是一次写出,
//可以优化下低于8k一次写出,否则分批,不是很清楚写太大的数据行不行,这里仅供参考
if(bb.length>1024*8){
int len=bb.length;
int k=1024*8;
int j=0;
while(true){
if(j*k<len){
if((j+1)*k<len){
sos.write(bb,j*k,k);//从哪开始,多少长度
}else{
sos.write(bb,j*k,len-j*k); //可能存在的最后不满8k的部分,这样输出
}
}else{ //说明全输出完了
break;
}
}
}else{
sos.write(bb, 0, bb.length);
}
sos.close();
将二进制数据转换成Base64字符串:(参考:https://www.cnblogs.com/watchfree/p/6536823.html)
String base64String = new String(byteArray).replaceAll("\n","");
自己在实际工作中的应用:
将图片以二进制编码的形式存入到数据库中; 在需要将图片展示在前台页面中时,需要将图片二进制编码成base64编码。
生成的base64编码中会带有换行符\n,如果直接使用new String(byteArray) 得到的base64编码是不能转换成图片的,所以要带上replaceAll("\n",""),去掉换行符.