目录
一、代码实现
1、创建 SpringBoot 项目
2、导入相关依赖 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ImageUploadAndDownload</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>image upload and download demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- thymeleaf模板 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
<!-- springboot-mybatis -->
<!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.24</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、配置 druid 数据库连接池、mybatis
application.yml
spring:
datasource:
username: root
password: su666
url: jdbc:mysql://localhost:3306/save_image?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
application.properties
server.port=8081
# 设置 mybatis 的查询路径
mybatis.type-aliases-package=com.imageuploadanddownload.demo.Pojo
mybatis.mapper-locations=classpath:mapper/*.xml
4、创建数据表
CREATE TABLE image_test (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) COMMENT '名称',
photo blob COMMENT '照片'
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci;
5、创建实体类(Pojo层)
ImgObj.java
package com.imageuploadanddownload.demo.Pojo;
import java.util.Arrays;
public class ImgObj {
private Integer id;
private String name;
private byte[] photo;
public ImgObj() {
}
public ImgObj(Integer id, String name, byte[] photo) {
this.id = id;
this.name = name;
this.photo = photo;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public byte[] getPhoto() {
return photo;
}
public void setPhoto(byte[] photo) {
this.photo = photo;
}
@Override
public String toString() {
return "ImgObj{" +
"id=" + id +
", name='" + name + '\'' +
", photo=" + Arrays.toString(photo) +
'}';
}
}
6、Mapper层
ImageMapper.java
package com.imageuploadanddownload.demo.Mapper;
import com.imageuploadanddownload.demo.Pojo.ImgObj;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Repository
@Mapper
public interface ImageMapper {
// 通过 mybatis 向 MySQL 中插入一条数据
public boolean insertToMySQL(String imageName, byte[] imageData);
// 通过 id 读取数据
public ImgObj queryById(int id);
}
ImageMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.imageuploadanddownload.demo.Mapper.ImageMapper">
<insert id="insertToMySQL">
insert into image_test (name, photo) values (#{imageName}, #{imageData})
</insert>
<select id="queryById" resultType="ImgObj">
select * from image_test where id = #{id}
</select>
</mapper>
7、Service层
ImageService.java
package com.imageuploadanddownload.demo.Service;
import com.imageuploadanddownload.demo.Pojo.ImgObj;
public interface ImageService {
// 向 MySQL 中插入数据
public boolean insertToMySQL(String imageName, byte[] imageData);
// 根据 id 查寻数据
public ImgObj queryById(int id);
}
ImageServiceImpl.java
package com.imageuploadanddownload.demo.Service;
import com.imageuploadanddownload.demo.Mapper.ImageMapper;
import com.imageuploadanddownload.demo.Pojo.ImgObj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ImageServiceImpl implements ImageService{
@Autowired
private ImageMapper imageMapper;
@Override
public boolean insertToMySQL(String imageName, byte[] imageData) {
return imageMapper.insertToMySQL(imageName, imageData);
}
@Override
public ImgObj queryById(int id) {
return imageMapper.queryById(id);
}
}
8、Controller层
ImageController.java
package com.imageuploadanddownload.demo.Controller;
import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream;
import com.imageuploadanddownload.demo.Pojo.ImgObj;
import com.imageuploadanddownload.demo.Service.ImageServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
@Controller
public class ImageController {
@Autowired
private ImageServiceImpl imageService;
@RequestMapping("/imageTest")
public String image_test(){
return "upload_image";
}
@PostMapping("/upload")
public String upload_image(@RequestParam("file") MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
byte[] imageData = new byte[(int) file.getSize()];
inputStream.read(imageData);
boolean img1 = imageService.insertToMySQL("img1", imageData);
System.out.println(img1);
ImgObj imgObj1 = imageService.queryById(1);
System.out.println(imgObj1.getName());
FileOutputStream fileOutputStream = new FileOutputStream("D:\\images\\Photo\\read1.jpg");
InputStream inputStream1 = new ByteArrayInputStream(imgObj1.getPhoto());
byte[] buffer = new byte[1024];
int len = 0;
while((len = inputStream1.read(buffer)) != -1){
fileOutputStream.write(buffer, 0, len);
}
inputStream1.close();
fileOutputStream.close();
return "upload_image";
}
}
9、前端页面
upload_image.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="file" name="file"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
10、目录结构