​ 在很多时候我们都需要使用图片上传的功能,比如:自定义头像、物品的图片描述、文章的插图等,那么我们该如何使用Springboot来方便快捷实现图片上传呢?我们闲话少说,直接上代码。

Springboot实现图片上传并返回URL

1. 问题引入

​ 在很多时候我们都需要使用图片上传的功能,比如:自定义头像、物品的图片描述、文章的插图等,那么我们该如何使用Springboot来方便快捷实现图片上传呢?我们闲话少说,直接上代码。

2. 后端代码

1. 创建Maven工程

pom文件依赖

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<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>

2. 编写代码

  1. 启动类

    1
    2
    3
    4
    5
    6
    @SpringBootApplication
    public class UploadApplication {
    public static void main(String[] args) {
    SpringApplication.run(UploadApplication.class);
    }
    }

    启动类没啥好说的。

  2. service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    @Service
    public class UploadService {

    private static final List<String> CONTENT_TYPES =
    Arrays.asList("image/jpeg", "image/gif", "image/png");

    /**
    * 图片上传:
    * 1. 判断文件类型合法性
    * 2. 判断文件内容合法性
    * 3. 保存文件
    * 4. 返回url
    *
    * @param file
    * @return
    */
    public String upload(MultipartFile file) {
    String originalFilename = file.getOriginalFilename();
    // 获取文件content type,判断是否为图片
    String contentType = file.getContentType();
    if (!CONTENT_TYPES.contains(contentType)) {
    // 文件类型不合法
    System.out.println("ERROR,文件类型不合法!");
    return null;
    }
    try {
    // 读取文件
    BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
    // 判断文件内容合法性
    if (bufferedImage == null) {
    System.out.println("ERROR,文件内容不合法!");
    return null;
    }
    // 将文件保存到服务器中
    file.transferTo(new File("D:\\test\\" + originalFilename));
    // 返回文件连接
    return "http://localhost/" + originalFilename;

    } catch (IOException e) {
    System.out.println("ERROR,服务器内部错误!");
    e.printStackTrace();
    }
    return null;
    }
    }

    service层是文件上传逻辑处理的关键,主要流程是:

     1. 判断文件名是否合法
     2. 判断文件内容是否合法
     3. 保存文件【处理文件名】
     4. 拼接url并返回
  3. controller

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @RestController
    @RequestMapping("/upload")
    public class UploadController {

    @Autowired
    private UploadService uploadService;

    /**
    * 图片上传
    *
    * @param file
    * @return
    */
    @PostMapping("image")
    public Result uploadImage(@RequestParam("file") MultipartFile file) {
    String url = this.uploadService.upload(file);
    if (url == null || url.length() == 0) {
    return new Result(false, StatusCode.ERROR, "图片上传异常");
    }
    return new Result(false, StatusCode.OK, "图片上传成功", url);
    }
    }

    这里主要知道使用MultipartFile接收上传的文件。

    这里的Result是自定义的规范,不是本问题的重点。

3. Nginx代理

​ 有了上面的步骤,我们可以实现文件上传到服务器端的磁盘,接下来我们使用Nginx将访问路径代理到我们存储图片的地方。

Nginx配置文件

1
2
3
4
5
6
7
8
server {
listen 8888;
server_name localhost;

# 将其它图片代理指向本地图片所在目录
location / {
root D:/test;
}

上面的配置文件表明了:nginx将所有访问的8888端口代理到了D盘的test目录下。

4. 测试

我们使用Postman,以Post方式,在Body中以form-data中使用file类型进行选择图片提交。可以参考: https://blog.csdn.net/qq_30033537/article/details/105604665

5. 总结

​ 实现图片上传并不麻烦,写这次博客主要是最近使用了图片上传的功能,有点陌生,写下来以后用到看起来也方便。哈哈哈哈哈哈哈!!!没错,被你们看穿了,我就是来水博客的,兑现之前立下的flag。

评论