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[] 其实可以直接用来存放数据库,中间转化,觉得挺有意思,所以也贴出来了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值