文件上传代码逻辑
實現圖片上傳
剛才的新增實現中,我們并沒有上傳圖片,接下來我們一起完成圖片上傳邏輯。
文件的上傳并不只是在品牌管理中有需求,以后的其它服務也可能需要,因此我們創建一個獨立的微服務,專門處理各種上傳。
搭建項目
創建module
依賴
我們需要EurekaClient和web依賴:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>learn</artifactId><groupId>com.learn.parent</groupId><version>1.0.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><groupId>com.learn.upload</groupId><artifactId>learn-upload</artifactId><version>1.0.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></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></dependency></dependencies> </project>編寫配置
server:port: 8082 spring:application:name: upload-serviceservlet:multipart:max-file-size: 5MB # 限制文件上傳的大小 # Eureka eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eurekainstance:lease-renewal-interval-in-seconds: 5 # 每隔5秒發送一次心跳lease-expiration-duration-in-seconds: 10 # 10秒不發送就過期需要注意的是,我們應該添加了限制文件大小的配置
引導類
@SpringBootApplication @EnableDiscoveryClient public class UploadApplication {public static void main(String[] args) {SpringApplication.run(UploadApplication.class, args);} }編寫上傳功能
文件上傳功能,也是自定義組件完成的,參照自定義組件用法指南:
在頁面中的使用:
controller
編寫controller需要知道4個內容:結合用法指南
-
請求方式:上傳肯定是POST
-
請求路徑:/upload/image
-
請求參數:文件,參數名是file,SpringMVC會封裝為一個接口:MultipartFile
-
返回結果:上傳成功后得到的文件的url路徑,也就是返回String
代碼如下:
@Controller @RequestMapping("upload") public class UploadController {@Autowiredprivate UploadService uploadService;/*** 圖片上傳* @param file* @return*/@PostMapping("image")public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file){String url = this.uploadService.upload(file);if (StringUtils.isBlank(url)) {return ResponseEntity.badRequest().build();}return ResponseEntity.status(HttpStatus.CREATED).body(url);} }service
在上傳文件過程中,我們需要對上傳的內容進行校驗:
校驗文件大小
校驗文件的媒體類型
校驗文件的內容
文件大小在Spring的配置文件中設置,因此已經會被校驗,我們不用管。
具體代碼:
@Service public class UploadService {private static final List<String> CONTENT_TYPES = Arrays.asList("image/jpeg", "image/gif");private static final Logger LOGGER = LoggerFactory.getLogger(UploadService.class);public String upload(MultipartFile file) {String originalFilename = file.getOriginalFilename();// 校驗文件的類型String contentType = file.getContentType();if (!CONTENT_TYPES.contains(contentType)){// 文件類型不合法,直接返回nullLOGGER.info("文件類型不合法:{}", originalFilename);return null;}try {// 校驗文件的內容BufferedImage bufferedImage = ImageIO.read(file.getInputStream());if (bufferedImage == null){LOGGER.info("文件內容不合法:{}", originalFilename);return null;}// 保存到服務器file.transferTo(new File("C:\\leyou\\images\\" + originalFilename));// 生成url地址,返回return "http://image.leyou.com/" + originalFilename;} catch (IOException e) {LOGGER.info("服務器內部錯誤:{}", originalFilename);e.printStackTrace();}return null;} }這里有一個問題:為什么圖片地址需要使用另外的url?
-
圖片不能保存在服務器內部,這樣會對服務器產生額外的加載負擔
-
一般靜態資源都應該使用獨立域名,這樣訪問靜態資源時不會攜帶一些不必要的cookie,減小請求的數據量
測試上傳
我們通過RestClient工具來測試:
上傳成功!
總結
- 上一篇: 品牌新增小结
- 下一篇: 绕过网关访问图片上传并解决跨域问题