java通过请求存放图片至数据库
数据库存放字段(sign_pic)类型:longblob
MySQL中,BLOB是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。BLOB类型实际是个类型系列(TinyBlob、Blob、MediumBlob、LongBlob),除了在存储的最大信息量上不同外,他们是等同的。
·tinyblob:仅255个字符
·blob:最大限制到65K字节
·mediumblob:限制到16M字节
·longblob:可达4GB
------------------------------------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>
对应java字段(signPic)类型:byte[]
准备到对应的java对象以及对应的数据表,处理http发送的图片。
当前的开发环境是:spingMVC+spring。
这边介绍下,处理http请求发送图片的两种方式:
1.通过SpringMVC自带的 MultipartFile 文件类型处理;
2.通过base64加码成字符串类型,后台用对应的字符串接收处理;
方式1:
这边不介绍 使用MultipartFile 作为对应的Controller方法的形参,来接收文件,这个需要对应的配置;
这边介绍通过CommonsMultipartResolver 解析request参数,得到 MultipartHttpServletRequest 对象,http传输的文件都包含在该对象中,感觉可以用来同时接收多个图片,下面贴下代码。
private MultipartFile doFile(HttpServletRequest request){ CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); multipartResolver.setResolveLazily(true); multipartResolver.setDefaultEncoding("utf-8"); if (multipartResolver.isMultipart(request)) { MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart(request); MultipartFile file = multipartRequest.getFile("pic"); //获取key是 pic指定的文件 Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); //http传输的文件都在这 return file; }else{ return null; } }
贴下测试的postMan请求:
拿到file文件即可转为byte[]存放至数据库。部分数据可是话工具可以看到该文件:
到此结束。
方式2:
将对应的图片转为base64字符串,百度一个线上的转化即可。
测试用postman发送对应的请求:
base64太长了,所以只能放body中进行传输,这边转成了json对象,后台比较方便接收,通过对应的形参即可。
解析json对象以及base64解码。
private MultipartFile getFileByRequestBodyPic(JSONObject jsonObject) throws IOException { String pic = jsonObject.getString("pic"); MultipartFile multipartFile = null; if(StringUtil.isNotEmpty(pic)){ multipartFile = this.getFileByBase64Pic(pic); } return multipartFile; }
private MultipartFile getFileByBase64Pic(String pic) throws IOException { byte[] bytes = this.getBytesByBase64Pic(pic); InputStream inputStream = new ByteArrayInputStream(bytes); MultipartFile file = new MockMultipartFile(ContentType.APPLICATION_OCTET_STREAM.toString(), inputStream); return file; }
private byte[] getBytesByBase64Pic(String pic) throws IOException { BASE64Decoder base64Decoder = new BASE64Decoder(); byte[] bytes = base64Decoder.decodeBuffer(pic); // for (int i = 0; i < bytes.length; ++i) { // if (bytes[i] < 0) {// 调整异常数据 // bytes[i] = (byte) (bytes[i] + 256); // } // } // this.getFileByBytes(bytes); return bytes; }
百度时,有些+256,但是我发现 补码转成byte 字节 还是一样的负数,这边就注释了,开发完成也是没有影响的。
为什么用MultipartFile?
这个类超级好用,不需要想普通的File类处理文件一般,需要指定对应的文件路径,才能将byte[] 数组转化为文件,这边可以直接运行在对应java内存中。具体的实现原理,还是需要去看源码学习才懂了,个人觉得很有意思。
不过这边解码出来的byte[] 其实可以直接用来存放数据库,中间转化,觉得挺有意思,所以也贴出来了。