springboot集成mysql数据库实现文件上传下载
引入依赖
引入swagger依赖 方便接口调试
<!--swagger-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
相关类
1、文件实体类
@Data
@Table(name = "upload_local_file")
@Entity
public class UploadLocalFile {
@ApiModelProperty
@Id
private Long id;
@ApiModelProperty("文件名称")
private String fileName;
@ApiModelProperty("原始文件名")
private String originalName;
@ApiModelProperty("扩展名")
private String extensionName;
@ApiModelProperty("访问地址 相对地址")
private String url;
}
2、jpa接口类
public interface UploadLocalFileRepository extends JpaRepository<UploadLocalFile,Long>{
}
文件上传
- controller
@ApiOperation(value = "文件上传", notes = "文件上传")
@PostMapping("/upload")
public ResponseEntity<UploadFile> fileUpload(@RequestParam("file") MultipartFile file) {
try {
UploadFile uploadFile = uploadFileService.fileUpload(file);
return ResponseEntity.ok().body(uploadFile);
} catch (Exception e) {
log.error(String.valueOf(e.getStackTrace()));
return ResponseEntity.badRequest().body(null);
}
}
- service
@Autowired
UploadLocalFileRepository uploadLocalFileRepository;
@Value("${file.dir}")
private String dirUrl;
@Value("${file.base-url}")
private String baseUrl;
/**
* 上传文件
*
* @param file
* @return
*/
public UploadFile fileUpload(MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
String originalFilename = file.getOriginalFilename();
long id = System.currentTimeMillis();
String extensionName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
String fileName = id + "." + extensionName;
saveToDisk(inputStream, originalFilename);
inputStream.close();
UploadLocalFile uploadLocalFile = new UploadLocalFile();
uploadLocalFile.setId(id);
uploadLocalFile.setExtensionName(extensionName);
uploadLocalFile.setOriginalName(originalFilename);
uploadLocalFile.setFileName(fileName);
uploadLocalFile.setUrl(baseUrl+"/"+id);
UploadLocalFile save = uploadLocalFileRepository.save(uploadLocalFile);
UploadFile uploadFile = new UploadFile();
BeanUtils.copyProperties(save, uploadFile);
return uploadFile;
}
/**
* 保存文件到本地
*
* @param inputStream
* @param fileName
* @throws IOException
*/
public void saveToDisk(InputStream inputStream, String fileName) throws IOException {
FileOutputStream outputStream = null;
try {
File file = new File(dirUrl);
if (!file.exists()) {
file.mkdirs();
}
outputStream = new FileOutputStream(dirUrl + "/" + fileName);
byte[] bytes = new byte[1024];
int b;
while ((b = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, b);
}
} catch (Exception e) {
log.error(e.getStackTrace().toString());
} finally {
if (outputStream != null) {
outputStream.close();
}
}
}
- application.yml
file:
dir: d:/
base-url: http://127.0.0.1:8009/api/uploadFileController/getFileStreamById
dir:上传的文件保存到服务器本地地址
base-url:http文件下载路径接口地址
- swagger接口测试
- 数据库存储数据格式
同时本地指定路劲下也保存了文件
文件下载
- controller
@ApiOperation(value = "根据文件id下载文件",notes = "根据文件id下载文件")
@GetMapping("/getFileStreamById/{fileId}")
public void getFileStreamById(@PathVariable Long fileId, HttpServletResponse httpServletResponse){
UploadLocalFile byId = uploadLocalFileRepository.findById(fileId).get();
File file = new File(dirUrl+"/"+byId.getFileName());
ServletOutputStream fileOutputStream = null;
FileInputStream inputStream = null;
httpServletResponse.setContentType("multipart/form-data");
try {
httpServletResponse.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(byId.getFileName(), "utf-8"));
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
try {
inputStream = new FileInputStream(file);
fileOutputStream = httpServletResponse.getOutputStream();
byte[] bytes = new byte[1024];
int b;
while((b=inputStream.read(bytes))!= -1){
fileOutputStream.write(bytes,0,b);
}
fileOutputStream.flush();
}catch (IOException e){
log.error(e.getStackTrace().toString());
}finally {
try {
if(inputStream != null){
inputStream.close();
}
if(fileOutputStream != null){
fileOutputStream.close();
}
}catch (IOException e){
log.error(e.getStackTrace().toString());
}
}
}
文件下载响应头的设置
content-type
指示响应内容的格式
content-disposition
指示如何处理响应内容。
一般有两种方式:
inline
:直接在页面显示attchment
:以附件形式下载
根据文件id 下载文件 同理根据文件名称也可以匹配下载
- swagger测试
版权声明:本文为zhou_fan_xi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。