前端
request
body:form-data
type: POST
params
name: file, value: 选择文件, type: file
name: dir, value: user_pic, type: String
controller
@RestController
@RequestMapping("/files")
public class UploadController {
@Resource
private FileService fileService;
@PostMapping("/upload")
private R upload(@RequestParam(value = "file") MultipartFile file, HttpServletRequest request) throws IOException {
if (file.isEmpty()) {
return R.error(StatusCode.FILE_ERROR);
}
// 获取用户传来的指定文件夹名称,用于做文件隔离,
// 不同业务的文件放在不同目录下
String dir = request.getParameter("dir");
return R.ok(fileService.uploadFile(file, dir));
}
}
service/impl
@Service
public class FileServiceImpl implements FileService {
// 获取项目路径,接收的文件存到项目路径下的某文件夹内
private static final String ROOT_PATH = System.getProperty("user.dir") + "/resources";
@Override
public String uploadFile(MultipartFile file, String dir_name) throws IOException {
String originalFilename = file.getOriginalFilename();
// 截取文件名后缀-即文件类型名称
assert originalFilename != null;
String fileNameSuffix = originalFilename.substring(originalFilename.lastIndexOf("."));
// 利用时间戳+随机UUID+文件类型 组成新的文件名称
long flag = System.currentTimeMillis();
String newFileName = flag + UUID.randomUUID().toString() + fileNameSuffix;
// 指定文件上传后的目录,例: targetPath-> D://files/xxx/dir_name
File targetPath = new File(ROOT_PATH, dir_name);
// 指定文件上传后的服务器完整文件名,例: targetFileName-> D://files/xxx/dir_name/xxx.jpg
File targetFileName = new File(targetPath, newFileName);
// 对dir_name这一层分类目录进行判空,空则新建
if (!targetFileName.getParentFile().exists()) targetFileName.getParentFile().mkdirs();
// 把MultipartFile对象内的文件输出到对应的路径中,即为将内存中的文件缓存写入硬盘
file.transferTo(targetFileName);
// 数据库中存储的文件路径,当加上服务器地址后即可访问资源文件
return "/upload/" + dir_name + "/" + newFileName;
}
}
`