基于Spring-mvc和Mybatis的图片文件上传数据库,以blob格式保存
controller层,我删减了部分代码,本来有个修改,只留了上传图片,用了一个ImageDTO来接收对象,也可以直接用MultipartFile接收。
@Log(description = "上传图片到数据库", type = 2, value = 1)
@ApiOperation(value = "上传图片到数据库", notes = "上传图片", code = 200, produces = "application/json")
@PostMapping(value = "/uploadPic")
public RestResult registerSubmit(ImageDTO imageDTO, HttpServletResponse response, HttpServletRequest request) throws Exception {
try {
Image image = new Image();
image.setImgId(UUID.randomUUID().toString());
imageServie.addPic(image, imageDTO.getPic());
return ResultGenerator.genSuccessResult(image.getImgId());
}
}catch (Exception e){
throw new CustomException(ResultCode.OFFICE_UPLOAD_FAIL);
}
}
这是ImageDTO 的两个属性
private String imgId;
private MultipartFile pic; //接收的文件
这是Image 图片类
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Image implements Serializable {
@Id
@Column(name = "img_id")
private String imgId;
private byte[] image;
}
service方法如下
//上传图片
public String addPic(Image image,MultipartFile pic1) throws Exception {
//转换图片格式 :MultipartFile --> byte
byte[] b1 = pic1.getBytes();
image.setImage(b1); //将转换后的byte[]存入到image类中byte[]字段
imageMapper.addPic(image);
return "success";
}
ImageMapper.xml配置如下
<resultMap id="BaseResultMap" type="com.x.x.pic.domain.Image">
<!--
WARNING - @mbg.generated
-->
<id column="img_id" jdbcType="VARCHAR" property="imgId" />
<result column="image" jdbcType="BLOB" property="image" typeHandler="org.apache.ibatis.type.BlobTypeHandler"/>
</resultMap>
<!--上传图片-->
<insert id="addPic" parameterType="com.cebon.cdjcy.pic.domain.Image">
insert into image
values
( #{imgId},#{image,jdbcType=BLOB})
</insert>
再介绍下MySql数据的4个blob的区别,可以根据需求选择。
- tinyblob:仅255个字符
- blob:最大限制到65K字节
- mediumblob:限制到16M字节
- longblob:可达4GB