前書き: 現在の SpringBoot プロジェクトの一般的なファイルのアップロードおよびダウンロード機能の概要を示します。一般的なダウンロード方法が 3 つと、アップロード方法が 1 つあります。ここで共有するメモがあります。
目次
3.1. Spring フレームワークによって提供されるダウンロード方法を使用する
3.2. IOUtils を介したストリームとしてダウンロード
1.pom依存性
<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、yml設定ファイル
# Spring配置
spring:
# 文件上传
servlet:
multipart:
# 单个文件大小
max-file-size: 10MB
# 设置总上传的文件大小
max-request-size: 20MB
server:
port: 9090
3. ファイルのダウンロード
3.1. Spring フレームワークによって提供されるダウンロード方法を使用する
キーコード:
/**
* 使用Spring框架自带的下载方式
* @param filePath
* @param fileName
* @return
*/
public ResponseEntity<Resource> download(String filePath,String fileName) throws Exception {
fileName = URLEncoder.encode(fileName,"UTF-8");
File file = new File(filePath);
if(!file.exists()){
throw new Exception("文件不存在");
}
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName ).body(new FileSystemResource(filePath));
}
リクエスト層:
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FileUtil fileUtil;
@GetMapping("/spring/download")
public ResponseEntity<Resource> download() throws Exception {
String filePath = "D:\\1.jpg";
String fileName = "Spring框架下载.jpg";
return fileUtil.download(filePath,fileName);
}
}
ブラウザ入力: http://localhost:9090/file/spring/download
ダウンロードが完了しました。
3.2. IOUtils を介したストリームとしてダウンロード
キーコード:
/**
* 通过IOUtils以流的形式下载
* @param filePath
* @param fileName
* @param response
*/
public void download(String filePath , String fileName, HttpServletResponse response) throws Exception {
fileName = URLEncoder.encode(fileName,"UTF-8");
File file=new File(filePath);
if(!file.exists()){
throw new Exception("文件不存在");
}
response.setHeader("Content-disposition","attachment;filename="+ fileName);
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream,response.getOutputStream());
response.flushBuffer();
fileInputStream.close();
}
リクエスト層:
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FileUtil fileUtil;
@GetMapping("/io/download")
public void ioDownload(HttpServletResponse response) throws Exception {
String filePath = "D:\\1.jpg";
String fileName = "IO下载.jpg";
fileUtil.download(filePath,fileName,response);
}
}
ブラウザアクセス: http://localhost:9090/file/io/download
ダウンロードに成功しました。
3.3. 読みながらダウンロードする
キーコード:
/**
* 原始的方法,下载一些小文件,边读边下载的
* @param filePath
* @param fileName
* @param response
* @throws Exception
*/
public void downloadTinyFile(String filePath,String fileName, HttpServletResponse response)throws Exception{
File file = new File(filePath);
fileName = URLEncoder.encode(fileName, "UTF-8");
if(!file.exists()){
throw new Exception("文件不存在");
}
FileInputStream in = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while((len = in.read(b))!=-1){
out.write(b, 0, len);
}
out.flush();
out.close();
in.close();
}
リクエスト層:
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FileUtil fileUtil;
@GetMapping("/tiny/download")
public void tinyDownload(HttpServletResponse response) throws Exception {
String filePath = "D:\\1.jpg";
String fileName = "tiny下载.jpg";
fileUtil.downloadTinyFile(filePath,fileName,response);
}
}
ブラウザ入力: http://localhost:9090/file/tiny/download
ダウンロードに成功しました。
4. ファイルのアップロード
MultipartFile を使用してファイルをアップロードする
/**
* 上传文件
* @param multipartFile
* @param storagePath
* @return
* @throws Exception
*/
public String upload(MultipartFile multipartFile, String storagePath) throws Exception{
if (multipartFile.isEmpty()) {
throw new Exception("文件不能为空!");
}
String originalFilename = multipartFile.getOriginalFilename();
String newFileName = UUID.randomUUID()+"_"+originalFilename;
String filePath = storagePath+newFileName;
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
multipartFile.transferTo(file);
return filePath;
}
リクエスト層:
@RestController
@RequestMapping("/file")
public class FileController {
@Autowired
private FileUtil fileUtil;
@PostMapping("/multipart/upload")
public String download(MultipartFile file) throws Exception {
String storagePath = "D:\\";
return fileUtil.upload(file,storagePath);
}
}
postman ツールを使用してテストします。
D ドライブでこのファイルを見つけます。
5、ツールクラスの完全なコード
package com.example.file.utils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.UUID;
/**
* 文件工具类
* @author HTT
*/
@Component
public class FileUtil {
/**
* 使用Spring框架自带的下载方式
* @param filePath
* @param fileName
* @return
*/
public ResponseEntity<Resource> download(String filePath,String fileName) throws Exception {
fileName = URLEncoder.encode(fileName,"UTF-8");
File file = new File(filePath);
if(!file.exists()){
throw new Exception("文件不存在");
}
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION,
"attachment; filename=" + fileName ).body(new FileSystemResource(filePath));
}
/**
* 通过IOUtils以流的形式下载
* @param filePath
* @param fileName
* @param response
*/
public void download(String filePath , String fileName, HttpServletResponse response) throws Exception {
fileName = URLEncoder.encode(fileName,"UTF-8");
File file=new File(filePath);
if(!file.exists()){
throw new Exception("文件不存在");
}
response.setHeader("Content-disposition","attachment;filename="+ fileName);
FileInputStream fileInputStream = new FileInputStream(file);
IOUtils.copy(fileInputStream,response.getOutputStream());
response.flushBuffer();
fileInputStream.close();
}
/**
* 原始的方法,下载一些小文件,边读边下载的
* @param filePath
* @param fileName
* @param response
* @throws Exception
*/
public void downloadTinyFile(String filePath,String fileName, HttpServletResponse response)throws Exception{
File file = new File(filePath);
fileName = URLEncoder.encode(fileName, "UTF-8");
if(!file.exists()){
throw new Exception("文件不存在");
}
FileInputStream in = new FileInputStream(file);
response.setHeader("Content-Disposition", "attachment;filename="+fileName);
OutputStream out = response.getOutputStream();
byte[] b = new byte[1024];
int len = 0;
while((len = in.read(b))!=-1){
out.write(b, 0, len);
}
out.flush();
out.close();
in.close();
}
/**
* 上传文件
* @param multipartFile
* @param storagePath
* @return
* @throws Exception
*/
public String upload(MultipartFile multipartFile, String storagePath) throws Exception{
if (multipartFile.isEmpty()) {
throw new Exception("文件不能为空!");
}
String originalFilename = multipartFile.getOriginalFilename();
String newFileName = UUID.randomUUID()+"_"+originalFilename;
String filePath = storagePath+newFileName;
File file = new File(filePath);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
multipartFile.transferTo(file);
return filePath;
}
}
6.Giteeのソースコード
コード クラウド アドレス: SpringBoot はファイルのアップロードとダウンロードを実装します
7. まとめ
以上がSpringBootでワンクリックでコピーして利用できるファイルアップロード・ダウンロード機能を実装するための注意事項です。