SpringBoot上传及下载文件

上传文件

核心是使用file.transferTo()方法将上传文件写入到指定路径的文件中

  1. 通过MultipartFile类对象来接收前端传递的文件,通过getOriginalFilename()来获取上传文件名(文件名+后缀)
  2. 将文件名与父目录拼接成全路径
  3. 判断全路径中父目录是否存在(常用file.getParentFile().Exist()hutool包下FileUtil.exist()判断),不存在则创建父目录
  4. 判断该文件是否已存在,若已存在则重新指定文件名
  5. 使用transferTo()方法将文件进行存储

下载文件

核心是用HttpServletResponse类对象的输出流将读取的bytes数组进行输出

  1. 根据传入文件名拼接文件存储的全路径
  2. 判断全路径下是否有该文件,没有则返回
  3. 通过hutool包下FileUtil.readBytes(fullPath)来读取文件并返回bytes数组
  4. 获取HttpServletResponse类对象并使用其输出流write()方法将bytes数组
@RestController
@RequestMapping("/file")
public class TestFileController {
  public static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";

  @Value("ip: localhost")
  private String ip;

  @Value("port: 8080")
  private Integer port;

  @PostMapping("/upload") // 上传文件
  public Result upload(MultipartFile file) throws IOException {
    String originalFilename = file.getOriginalFilename(); // aaa.jpg
//    String mainName = FileUtil.mainName(originalFilename); aaa 文件名
//    String ext = FileUtil.extName(originalFilename); jpg 文件后缀

    String fullPath = ROOT_PATH + File.separator + originalFilename;

    if (!FileUtil.exist(ROOT_PATH)){
      FileUtil.mkdir(ROOT_PATH); // 父目录不存在则创建
    }

    if (FileUtil.exist(fullPath)){
      fullPath = ROOT_PATH + File.separator + System.currentTimeMillis() + originalFilename; // 文件重复则重新指定文件名
    }

    file.transferTo(new File(fullPath)); // 存储文件到本地
    String downloadUrl = "http://" + ip + ":" + port + "/file/download" + originalFilename;
    return new Result().success().data("download_url", downloadUrl);
  }

  @GetMapping("/download/{fileName}") // 下载文件
  public void download(@PathVariable("fileName") String fileName, HttpServletResponse response)
      throws IOException {
    String fullPath = ROOT_PATH + File.separator + fileName;
    OutputStream outputStream = response.getOutputStream(); // 获取输出流
    outputStream = new BufferedOutputStream(outputStream); // 创建缓冲输出流

    if (!FileUtil.exist(fullPath)){
      return;
    }

    byte[] bytes = FileUtil.readBytes(fullPath); // 读取文件

    outputStream.write(bytes); // 输出文件;
    outputStream.flush();
    outputStream.close();
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值