jsp上传图片的二进制数据到服务器,并显示服务器传的二进制数据

好处:不需要图片服务器,不需要处理文件夹、文件是否存在、重复等问题
参考:https://blog.csdn.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[]数据,可以直接省略读操作,一点一点写出即可
jsp上传图片的二进制数据到服务器,并显示服务器传的二进制数据
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",""),去掉换行符.