SpringCloud文件上传

电玩女神 2024-04-18 10:50 178阅读 0赞

2.实现图片上传

刚才的新增实现中,我们并没有上传图片,接下来我们一起完成图片上传逻辑。

文件的上传并不只是在品牌管理中有需求,以后的其它服务也可能需要,因此我们创建一个独立的微服务,专门处理各种上传。

2.1.搭建项目

2.1.1.创建SpringCloud项目

2.1.2.添加依赖

我们需要EurekaClient和web依赖:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <parent>
  4. <artifactId>leyou</artifactId>
  5. <groupId>com.leyou.parent</groupId>
  6. <version>1.0.0-SNAPSHOT</version>
  7. </parent>
  8. <modelVersion>4.0.0</modelVersion>
  9. <groupId>com.leyou.service</groupId>
  10. <artifactId>ly-upload</artifactId>
  11. <version>1.0.0-SNAPSHOT</version>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.apache.commons</groupId>
  23. <artifactId>commons-lang3</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.projectlombok</groupId>
  27. <artifactId>lombok</artifactId>
  28. </dependency>
  29. </dependencies>
  30. </project>

2.1.3.编写配置

  1. server:
  2. port: 8082
  3. spring:
  4. application:
  5. name: upload-service
  6. servlet:
  7. multipart:
  8. max-file-size: 5MB # 限制文件上传的大小
  9. # Eureka
  10. eureka:
  11. client:
  12. service-url:
  13. defaultZone: http://127.0.0.1:10086/eureka
  14. instance:
  15. lease-renewal-interval-in-seconds: 5 # 每隔5秒发送一次心跳
  16. lease-expiration-duration-in-seconds: 10 # 10秒不发送就过期
  17. prefer-ip-address: true
  18. ip-address: 127.0.0.1
  19. instance-id: ${ spring.application.name}:${ server.port}

需要注意的是,我们应该添加了限制文件大小的配置

2.1.4.启动类

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

结构:

在这里插入图片描述

2.2.编写上传功能

2.2.1.controller

编写controller需要知道4个内容:

  • 请求方式:上传肯定是POST
  • 请求路径:/upload/image
  • 请求参数:文件,参数名是file,SpringMVC会封装为一个接口:MultipleFile
  • 返回结果:上传成功后得到的文件的url路径

代码如下:

  1. package com.leyou.upload.web;
  2. import com.leyou.upload.service.UploadService;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import org.springframework.web.multipart.MultipartFile;
  12. @RestController
  13. @RequestMapping("upload")
  14. public class UploadController {
  15. @Autowired
  16. private UploadService uploadService;
  17. /** * 上传图片功能 * @param file * @return */
  18. @PostMapping("image")
  19. public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file){
  20. String url = uploadService.uploadImage(file);
  21. if(StringUtils.isBlank(url)){
  22. // url为空,证明上传失败
  23. return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
  24. }
  25. // 返回200,并且携带url路径
  26. return ResponseEntity.ok(url);
  27. }
  28. }

2.2.2.service

在上传文件过程中,我们需要对上传的内容进行校验:

  1. 校验文件大小
  2. 校验文件的媒体类型
  3. 校验文件的内容

文件大小在Spring的配置文件中设置,因此已经会被校验,我们不用管。

具体代码:

  1. package com.leyou.upload.service;
  2. import com.leyou.common.enums.ExceptionEnum;
  3. import com.leyou.common.exception.LyException;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import javax.imageio.ImageIO;
  8. import java.awt.image.BufferedImage;
  9. import java.io.File;
  10. import java.io.IOException;
  11. import java.util.Arrays;
  12. import java.util.List;
  13. @Service
  14. @Slf4j
  15. public class UploadService {
  16. private static final List<String> ALLOW_TYPES = Arrays.asList("image/png", "image/jpeg", "image/bmg");
  17. public String uploadImage(MultipartFile file) {
  18. try {
  19. //校验文件类型
  20. String contentType = file.getContentType();
  21. if(!ALLOW_TYPES.contains(contentType)){
  22. throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
  23. }
  24. //校验文件的内容
  25. BufferedImage image = ImageIO.read(file.getInputStream());
  26. if(image == null){
  27. throw new LyException(ExceptionEnum.INVALID_FILE_TYPE);
  28. }
  29. //准备目标路径
  30. File dest = new File("E:\\黑马程序员57期\\09 微服务电商【黑马乐优商城】\\upload\\",file.getOriginalFilename());
  31. file.transferTo(dest);
  32. //返回路径
  33. return "http://image.leyou.com/"+file.getOriginalFilename();
  34. } catch (IOException e) {
  35. log.error("上传文件失败",e);
  36. throw new LyException(ExceptionEnum.UPLOAD_FILE_ERROR);
  37. }
  38. }
  39. }

这里有一个问题:为什么图片地址需要使用另外的url?

  • 图片不能保存在服务器内部,这样会对服务器产生额外的加载负担
  • 一般静态资源都应该使用独立域名,这样访问静态资源时不会携带一些不必要的cookie,减小请求的数据量

2.2.3.测试上传

我们通过RestClient工具来测试:
在这里插入图片描述
结果:
1526197027688.png
去目录下查看:
1526197060729.png
上传成功!

发表评论

表情:
评论列表 (有 0 条评论,178人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringCloud文件

    2.实现图片上传 刚才的新增实现中,我们并没有上传图片,接下来我们一起完成图片上传逻辑。 文件的上传并不只是在品牌管理中有需求,以后的其它服务也可能需要,因此我们创...

    相关 php 文件,PHP 文件

    文件上传概述 文件上传功能是网络生活中经常使用的一个功能。使用 PHP 可以很方便的实现文件上传,其具体流程如下: 表单选择文件 -> 检查文件大小及类型 -> 生成临时文