后端代码
package com.example.backend.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.example.backend.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
/**
* @author hrui
* @date 2024/3/16 1:47
*/
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
//文件上传存储路径
private static final String filePath=System.getProperty("user.dir")+"/upload/";
/**
* 文件上传
*/
@PostMapping("/upload")
public Result upload(MultipartFile file) {
synchronized (FileController.class) {//加锁 确保文件名不重复
String flag = System.currentTimeMillis() + "";
//原始文件名
String fileName = file.getOriginalFilename();
try {
if (!FileUtil.isDirectory(filePath)) {
FileUtil.mkdir(filePath);
}
// 文件存储位置;原逻辑-文件名
FileUtil.writeBytes(file.getBytes(), filePath + flag + "-" + fileName);
System.out.println(fileName + " --上传成功");
//Thread.sleep(1L);
} catch (Exception e) {
System.err.println(fileName + " --文件上传失败");
}
return Result.success("上传成功",flag);
}
}
/**
* 文件下载
*/
// @GetMapping映射HTTP GET请求到特定的处理方法
// @PathVariable用来接收请求URL中的flag值
@GetMapping("/{flag}")
public void avatarPath(@PathVariable String flag, HttpServletResponse response) {
// 检查filePath是否是目录,如果不是则创建
if (!FileUtil.isDirectory(filePath)) {
FileUtil.mkdir(filePath);
}
// 用于写入响应流的输出流
OutputStream os;
// 获取filePath路径下的所有文件名
List<String> fileNames = FileUtil.listFileNames(filePath);
// 从文件名列表中筛选包含flag的文件名,如果没有找到则返回空字符串
String avatar = fileNames.stream().filter(name -> name.contains(flag)).findAny().orElse("");
try {
// 如果avatar不为空,则执行文件下载操作
if (StrUtil.isNotEmpty(avatar)) {
// 设置响应的头部信息,告诉浏览器这是一个附件下载操作,并提供文件名
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(avatar, "UTF-8"));
// 设置响应的内容类型为字节流
response.setContentType("application/octet-stream");
// 读取filePath和avatar组合后的文件路径的所有字节
byte[] bytes = FileUtil.readBytes(filePath + avatar);
// 获取响应的输出流
os = response.getOutputStream();
// 写入字节到响应输出流
os.write(bytes);
// 刷新输出流
os.flush();
// 关闭输出流
os.close();
}
} catch (Exception e) {
// 如果文件传输失败,打印失败信息
System.out.println("文件传输失败");
}
}
public static void main(String[] args) {
List<String> fileNames = FileUtil.listFileNames(filePath);
}
}
取图片