내용 :
A, SpringBoot 구성 여러 부분
둘째, 패키지 파일 작업 FileHelper.java
셋째, 업로드 및 다운로드 API 개발 FileController.java
네, 단위 테스트 FileControllerTest.java을
V. 확장
여섯, 일반적인 문제 및 솔루션
오픈 소스 프로젝트 : https://github.com/jextop/StarterApi
SpringBoot는 일반적으로 자바 개발 프레임 워크, 구성 요소의 매우 풍부한이있는 경우 사용 및 사용 기능의 용이성이다. 다중 서버에 파일을 업로드 지원 클라이언트에 사용되는 서버는 로컬 또는 클라우드에 저장 한 파일 스트림의 내용의 요청을 가져옵니다. 시스템 아키텍처 다이어그램은 다음과 같습니다 :
다음 관련된 주요 클래스 및 인터페이스 :
개발 단계 :
코드 파일 |
기능 점수 |
|
SpringBoot 구성 여러 부분 |
application.yml |
SpringBoot 웹 의존도는 다중 application.yml으로 배열 도입되었습니다 |
ServerConfig.java |
서비스 주소를 읽어 들여, URL 접합 |
|
MultipartConfig.java |
파일 저장, 로컬 스토리지 주소를 읽어 |
|
파일 작업 |
FileHelper의 된 .java |
읽기 및 쓰기 파일뿐만 아니라 보조 기능 |
API 개발 |
파일 컨트롤러 된 .java |
增加REST接口POST /upload/{file}, GET /download/{name} |
单元测试 |
FileControllerTest.java |
测试功能,MockHttpServletResponse, MockMultipartFile |
功能扩展 |
集成DB读写功能,建立数据表File |
在数据库中存储文件名称,MD5等信息,上传时判断MD5一样就重用,下载时返回源文件名。 |
FileTypeEnum.java |
声明文件类型,归类存储 |
|
LocationEnum.java |
支持本地或云端存储,比如阿里云、七牛云 |
一,SpringBoot配置Multipart
1. SpringBoot Web项目,已经包含了Multipart依赖,需要在application.yml中配置如下,开启multipart功能,指定文件大小范围和存储路径:
spring:
servlet:
multipart:
enabled: true
location: files
file-size-threshold: 0B
max-file-size: 10MB
max-request-size: 10MB
2. 配置ServerConfig,读取API服务的IP地址或者域名,在返回文件信息时拼接url。
3. 配置MultipartConfig,读取文件存储路径,FileHelper写入文件时使用。
二,封装文件操作
文件读写,生成存储路径和网络url,实现代码详见FileHelper.java
1. save()将MultipartFile文件流保存到服务器或云端。
2. read()将文件内容读出并写如HttpServletResponse中。
3. getFilePath()得到文件存储路径。
4. getFileUrl()得到访问文件的网络url
三,上传下载API开发FileController.java
增加两个REST接口,上传接口/file/upload是POST请求,处理单个或者多个文件;下载接口/file/download/{name}是GET请求,name是根据文件唯一编号+扩展名生成的名称。实现代码详见FileController.java
@RestController
@RequestMapping("/file")
public class FileController {
@PostMapping("/upload")
public Object upload(
@RequestParam(value = "file", required = false) MultipartFile file,
@RequestParam(value = "files", required = false) MultipartFile[] files
) {
if (file != null) {
LogUtil.info("/file/upload", file.getName());
}
if (!EmptyUtil.isEmpty(files)) {
LogUtil.info("/file/upload", files.length);
}
}
@GetMapping("/{name}")
public Object download(HttpServletResponse response, @PathVariable("name") String name) {
LogUtil.info("/file", name);
}
}
1,文件上传时首先根据内容生成MD5,通过MD5判断文件是否重复,然后保存文件并记录信息到数据库,返回文件url,时序图如下。
问答:为什么要保存文件信息到数据库?
- 首先将文件MD5保存起来,可以有效的避免文件重复。
- 存储在服务器时,文件名称使用一个新生成的唯一编号,这个编号也是url关键字。
- 文件原名保存到数据库,下载时可以返回给客户端。
2,下载文件时,从请求参数中获取文件编号,根据服务器存储路径查找文件。通过根据文件编号在数据库中查询并返回信息,流程图如下。
四,单元测试FileControllerTest.java
Spring框架提供了Mock功能辅助测试HTTP,我们用到org.springframework.mock.web包中的两个类:MockMultipartFile在上传时模拟文件,MockHttpServletResponse在下载时模拟HttpResponse响应。
1,创建一个临时文件,然后构建一个MockMultipartFile,测试upload()函数时传入。
File file = File.createTempFile("tmp", ".txt");
FileUtil.write(file.getPath(), "tmp file".getBytes());
MockMultipartFile multipart = new MockMultipartFile(
file.getName(), file.getName(), null,
new FileInputStream(file)
);
Object ret = fileController.doUpload(multipart, null);
2,新建一个MockHttpServletResponse实例,传入download()函数,将下载文件内容写入Response。
HttpServletResponse response = new MockHttpServletResponse();
Object ret = fileController.download(response, “f200216377344237183100944.jpg”);
3,运行FileControllerTest.java,,测试结果:
五,功能扩展
1. 存储文件时,将文件信息和MD5存入数据库,MD5用于检查重复文件,文件原名称等信息在下载时返回。
2. 文件存储时使用新生成的唯一编号作为文件名称,编号也是网络url关键字。
3. 文件存储可以扩展到云端,比如阿里云、七牛云,在FileController的upload()和download()函数流程中切换。
六,常见问题和解决方法
l 如何高效率的调试REST接口?
解决:有多种方法和API调式工具可用,介绍3个方式:
도 1은 단위 테스트 : 상기 도입은 스프링 프레임 워크 유닛 주요 기능을 다루는 기능을 테스트 및 자동 구성 시스템 및 통합 보조 HTTP 모의 기능 테스트를 제공하고, 버그 코드 및 변경, 품질 보증 프로그램에 의한 기능적 결함을 찾아 낼 수있다.
2, 자신감 인터페이스 문서 및 전화 : 자신감 프레임 워크를 정의 완전한 REST 인터페이스 문서 사양, 유지 보수 설명서를 허용 능력을 테스트하는 강력한 페이지, 디버그 및 시각화 API 인터페이스를 서비스 할 수있는 기능, 그리고 코드로 문서의 통합을 제공하며 코드 통합을 수정 전체 쉽게 문서를 수정 된 코드 로직 수정하면서 있도록.
브라우저를 엽니 다 // localhost를 : 8011 / 자신감 HTTP -ui.html, 확장 인터페이스 정보는 다음 파일을 선택하고 " 는 IT를 OU를보십시오! "
3, 우체부는 디버깅 툴 공통 API, 방법 및 요청 구성 환경 변수의 다양한 지원하고, 일괄 자동화, 자동 구축 및 시스템 통합, 효율적인을 가져 오거나 내보낼 JSON 파일 수는 없습니다 실행하기위한 테스트 검증, 지원의 결과를 반환 팀웍입니다.