springboot 文件上传下载

482 阅读1分钟

前期准备

使用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());
    }
}

测试结果:

image.png

image.png

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();
}