基于Spring-mvc和Mybatis的图片文件上传数据库,以blob格式保存

本文介绍如何使用Spring MVC和Mybatis实现图片文件上传并以BLOB格式存储到数据库的方法,包括Controller层代码、ImageDTO及Image实体类、Service层处理、Mapper配置等关键步骤。

基于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

<think>好的,我现在需要帮助用户解决如何使用MyBatis-Plus实现压缩文件上传的问题。首先,我得理清楚用户的需求。用户提到他们想使用MyBatis-Plus来实现压缩文件上传的功能,并请求示例代码。 首先,我需要明确MyBatis-Plus的主要功能。MyBatis-Plus是一个增强版的MyBatis,主要用于简化数据库操作,比如提供通用的Mapper、Service、条件构造器等,但它本身并不处理文件上传或压缩。因此,用户的问题可能有些混淆,因为文件上传通常属于Spring MVC或者Spring Boot的范畴,而压缩处理可能需要使用Java的压缩库,如java.util.zip或者Apache Commons Compress。 接下来,我需要考虑用户可能的误解。用户可能认为MyBatis-Plus可以处理文件上传,但实际上文件上传通常由Spring框架的MultipartFile处理,而MyBatis-Plus用于数据库交互。因此,正确的做法应该是结合Spring Boot处理文件上传压缩,然后使用MyBatis-Plus将文件信息存储到数据库中。 接下来,我需要构建一个示例流程。首先,用户通过前端上传文件,后端使用Spring Boot接收MultipartFile,然后进行压缩处理,将压缩后的文件保存到服务器或存储系统(如本地文件系统、云存储等),最后使用MyBatis-Plus将文件元数据(如文件名、路径、大小等)存入数据库。 在代码示例方面,需要创建实体类对应数据库表,Mapper接口继承BaseMapper,Service层处理业务逻辑(包括压缩保存文件),Controller处理HTTP请求。同时,需要处理文件压缩的逻辑,可能需要使用ZipOutputStream来压缩文件,或者使用其他压缩库。 还需要考虑异常处理,例如文件上传失败、压缩失败等情况,以及事务管理,确保数据库操作文件操作的一致性。此外,配置文件上传的大小限制,可能在application.properties中设置spring.servlet.multipart.max-file-size等参数。 用户可能没有明确说明是否希望将压缩后的文件存储在数据库BLOB字段中,还是仅存储文件路径。通常建议存储路径,而文件存在服务器或云存储中,因此示例代码可能采用这种方式。 最后,需要验证示例代码的正确性,确保各层之间的调用正确,依赖注入没有问题,MyBatis-Plus的配置正确,比如@TableName、@TableField等注解的使用。 总结,用户的问题需要分两部分解决:使用Spring Boot处理文件上传压缩,再使用MyBatis-Plus存储元数据。需要明确各部分的责任,并提供清晰的代码示例步骤说明。</think>使用MyBatis-Plus实现压缩文件上传需要结合Spring Boot的文件处理能力,MyBatis-Plus主要负责数据库操作。以下是实现步骤示例代码: ### 一、实现步骤 1. **添加依赖**:需包含Spring WebMyBatis-Plus 2. **实体类设计**:定义文件元数据存储结构 3. **文件压缩工具类**:实现ZIP压缩逻辑 4. **Service层**:处理文件上传+压缩+存储 5. **Controller层**:接收HTTP文件上传请求 ### 二、关键代码实现 #### 1. 实体类定义 ```java @Data @TableName("uploaded_file") public class FileMetadata { @TableId(type = IdType.AUTO) private Long id; private String originalName; private String compressedPath; private LocalDateTime uploadTime; } ``` #### 2. Mapper接口 ```java public interface FileMapper extends BaseMapper<FileMetadata> { } ``` #### 3. 压缩工具类 ```java public class ZipUtils { public static File compress(MultipartFile file) throws IOException { String zipName = file.getOriginalFilename() + ".zip"; File zipFile = new File(System.getProperty("java.io.tmpdir"), zipName); try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile))) { zos.putNextEntry(new ZipEntry(file.getOriginalFilename())); zos.write(file.getBytes()); zos.closeEntry(); } return zipFile; } } ``` #### 4. Service层实现 ```java @Service @RequiredArgsConstructor public class FileService { private final FileMapper fileMapper; @Transactional public FileMetadata uploadAndCompress(MultipartFile file) throws IOException { // 压缩文件 File compressed = ZipUtils.compress(file); // 存储元数据 FileMetadata metadata = new FileMetadata(); metadata.setOriginalName(file.getOriginalFilename()); metadata.setCompressedPath(compressed.getAbsolutePath()); metadata.setUploadTime(LocalDateTime.now()); fileMapper.insert(metadata); return metadata; } } ``` #### 5. Controller层 ```java @RestController @RequiredArgsConstructor public class FileController { private final FileService fileService; @PostMapping("/upload") public ResponseEntity<?> uploadFile(@RequestParam("file") MultipartFile file) { try { return ResponseEntity.ok(fileService.uploadAndCompress(file)); } catch (IOException e) { return ResponseEntity.status(500).body("文件处理失败"); } } } ``` ### 三、配置建议 在`application.properties`中添加: ```properties # 文件上传大小限制 spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=50MB # MyBatis-Plus配置 mybatis-plus.mapper-locations=classpath*:mapper/**/*.xml ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值