前期准备
使用hutool工具
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.5</version>
</dependency>
一. 上传
1.单文件上传
- controller
import com.example.ph_tools.service.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@RequestMapping("file")
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("upload")
public String upload(HttpServletRequest request, HttpServletResponse response){
fileService.upload(request, response);
return "上传成功!";
}
}
- service
import cn.hutool.core.io.file.FileWriter;
import com.example.ph_tools.service.FileService;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Service
public class FileServiceImpl implements FileService {
@Override
@SneakyThrows
public void upload(HttpServletRequest request, HttpServletResponse response) {
MultipartFile file = ((MultipartHttpServletRequest)request).getFile("file");
String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf(46));
String saveAddress = "D:/aaaaTest/";
FileWriter writer = new FileWriter(saveAddress+"文件名"+suffix);
writer.writeFromStream(file.getInputStream());
}
}
测试结果:
2.多文件上传
只需 把MultipartFile 改成 List for循环写入即可
import cn.hutool.core.io.file.FileWriter;
import com.example.ph_tools.service.FileService;
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@Service
public class FileServiceImpl implements FileService {
@Override
public void upload(HttpServletRequest request, HttpServletResponse response) {
List<MultipartFile> files = ((MultipartHttpServletRequest)request).getFiles("file");
files.forEach(file -> {
String filename = file.getOriginalFilename();
String suffix = filename.substring(filename.lastIndexOf(46));
String saveAddress = "D:/aaaaTest/";
FileWriter writer = new FileWriter(saveAddress+"文件名"+suffix);
try {
writer.writeFromStream(file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
下载
1.单文件下载
- controller
@GetMapping("download")
public String download(HttpServletRequest request, HttpServletResponse response){
fileService.download(request, response);
return "下载成功";
}
- service
@Override
@SneakyThrows
public void download(HttpServletRequest request, HttpServletResponse response) {
String srcPath = "D:/aaaaa/demo.docx";
FileReader fileReader = new FileReader(srcPath);
byte[] data = fileReader.readBytes();
response.setContentType("application/octet-stream");
String fileName = URLEncoder.encode("文件名称.后缀", "UTF8");
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
try (OutputStream out= response.getOutputStream() ){
out.write(data);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
2.文件夹打包下载
-
service
@Override
@SneakyThrows
public void downloads(HttpServletRequest request, HttpServletResponse response) {
String srcPath = "D:/aaaaa/test/20220729";
List<File> childrenFile = FileUtil.loopFiles(srcPath);
response.reset();
response.setCharacterEncoding("utf-8");
response.setContentType("multipart/form-data");
String downloadName = DateUtil.format(new Date(), "yyyyMMDDHHmmss")+".zip";
response.setHeader("Content-Disposition", "attachment;fileName="" + downloadName + "");
ZipOutputStream zipos = null;
zipos = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream()));
zipos.setMethod(ZipOutputStream.DEFLATED); //设置压缩方法
DataOutputStream os = null;
for (File file : childrenFile) {
String fileName = file.getPath().replace(srcPath,"").replace(srcPath.replace("/","\\"),"");
zipos.putNextEntry(new ZipEntry(fileName));
os = new DataOutputStream(zipos);
FileReader fileReader = new FileReader(file);
byte[] data = fileReader.readBytes();
os.write(data);
zipos.closeEntry();
}
os.flush();
os.close();
zipos.close();
}