springboot文件上传到本地

118 阅读1分钟

前端

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;

    }
}

`