SpringBoot 文件上传到指定文件夹

第一种

1、在application.yml文件中设置存储文件夹地址

upload:
  path: E:\upload\

2、配置映射路径

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //其中image表示访问的前缀。"file:E:/upload/"是文件真实的存储路径
        registry.addResourceHandler("/upload/**").addResourceLocations("file:E:/upload/");
    }
}

3、上传文件

上传文件类

@RestController
@RequestMapping("/user")
public class UserController {

    @Value("${upload.path}")
    private String filePath;


    //根据日期生成路径   2022/1/15/
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/");

    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public R<String> uploadFile(@RequestBody MultipartFile file) {
        if (file == null) return R.error("文件不能为空");
        //1、获取上传文件的名字
        String originalFilename = file.getOriginalFilename();
        //2、对原始文件名进行判断
        if (!originalFilename.endsWith(".jpg") && !originalFilename.endsWith(".png")) {
            return R.error("上传文件类型错误,请上传png或jpg类型的图片");
        }

        //3、使用工具类,防止重复 返回:af66cdc12867443787362575b92ca514.jpg
        String fileName = PathUtils.generateFilePath(originalFilename);
        //4、创建存储日期的文件夹
        String datePath = sdf.format(new Date());
        //5、创建目录
        File dir = new File(filePath + datePath, fileName);
        //6、如果不存在就创建该文件夹
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            //7、将文件转存到指定文件夹
            file.transferTo(dir);
        } catch (Exception e) {
            return R.error(e.getMessage());
        }
        return R.success(datePath + fileName);
    }
}

PathUtils类

public class PathUtils {

    public static String generateFilePath(String fileName){
        //uuid作为文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        //后缀和文件后缀一致,获取文件.jpg
        int index = fileName.lastIndexOf(".");
        // test.jpg -> .jpg
        String fileType = fileName.substring(index);
        return new StringBuilder().append(uuid).append(fileType).toString();
    }
}

结果返回类R

@Data
public class R<T> implements Serializable {
    private Integer code;       //编码:1成功,0和其它数字为失败
    private String msg;         //错误信息
    private T data;             //数据
    private Map map = new HashMap();   //动态数据

    public static <T> R<T> success(T object) {
        R<T> r = new R<T>();
        r.data = object;
        r.code = 1;
        return r;
    }
    public static <T> R<T> error(String msg) {
        R r = new R();
        r.msg = msg;
        r.code = 0;
        return r;
    }
    public R<T> add(String key, Object value) {
        this.map.put(key, value);
        return this;
    }
}

时间:2023-05-15 中午

第二种

1、在application.yml文件中设置存储文件夹地址

server:
  port: 9092

ip: localhost #主机ip

2、上传文件

Controller

@Api(tags = "文件上传接口")
@RestController
@RequestMapping("/api/admin/file")
public class AdminUpdateController {

    @Autowired
    private UploadService uploadService;


    /**
     * @param file 文件
     * @return String
     */
    @PostMapping("/upload")
    @ApiOperation(value = "文件上传")
    public Result<String> uploadFile(@RequestParam("file") MultipartFile file) {
        try {
            return uploadService.uploadFile(file);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 下载文件
     *
     * @param fileDate 文件夹日期
     * @param fileName 文件名称
     * @param response 响应流
     */
    @GetMapping("/download/{fileDate}/{fileName}")
    public void downloadFile(@PathVariable String fileDate,@PathVariable String fileName,
                             HttpServletResponse response) {
        uploadService.downloadFile(fileDate,fileName, response);
    }
}

Service

public interface UploadService {
    /**文件上传*/
    Result<String> uploadFile(MultipartFile file) throws IOException;

    /**下载文件*/
    void downloadFile(String fileDate,String fileName, HttpServletResponse response);
}

ServiceImpl

@Slf4j
@Service
public class UploadServiceImpl implements UploadService {


    /**
     * 主机ip,localhost默认值
     */
    @Value("${ip:localhost}")
    private String ip;

    /**
     * 主机端口
     */
    @Value("${server.port}")
    private String port;

    /**
     * ROOT_PATH文件表示在本地存储路径,File.separator代表分隔符
     * 列如:D:\javaXM\2024_Spring_Study\BS\files
     */
    private static final String ROOT_PATH = System.getProperty("user.dir") + File.separator + "files";

    /**
     * 文件上传
     *
     * @param file 文件
     */
    @Override
    public Result<String> uploadFile(MultipartFile file) {
        if (file == null) {
            return Result.failure(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
        }
        // 1、获取上传文件的名字
        String originalFilename = file.getOriginalFilename();
        // 2、判断文件名是否为空
        if (StrUtil.isEmpty(originalFilename)){
            return Result.failure(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
        }
        // 3、对原始文件名进行判断
        if (!originalFilename.endsWith(".jpg") && !originalFilename.endsWith(".png")) {
            return Result.failure(HttpCodeEnum.FILE_TYPE_ERROR_NEW);
        }
        // 4、使用工具类,防止重复 返回:af66cdc12867443787362575b92ca514.jpg
        String fileName = PathUtils.generateFilePath(originalFilename);;
        // 5、创建存储日期的文件夹 根据日期生成路径   yyyy-MM-dd/
        Date date = DateUtil.date(System.currentTimeMillis());
        String datePath = DateUtil.format(date, "yyyy-MM-dd/");
        // 6、判断文件夹是否存在
        if (!FileUtil.exist(ROOT_PATH+File.separator+datePath)) {
            // 如果当前文件的父级目录不存在,就创建
            FileUtil.mkdir(ROOT_PATH+File.separator+datePath);
        }
        // 7、创建目录
        File saveFile = new File(ROOT_PATH +File.separator+ datePath, fileName);
        // 8、存储文件到本地的磁盘里面去
        try {
            file.transferTo(saveFile);
        } catch (IOException e) {
            log.error(SystemConstants.ERROR_LOG, e.getMessage());
            throw new ServiceException(HttpCodeEnum.FILE_UPLOAD_ERROR_NEW);
        }
        // 9、返回的文件链接
        String url = "http://" + ip + ":" + port + "/api/admin/file/download/" + datePath + fileName;
        return Result.success(url);
    }



    /**
     * 下载文件
     */
    @Override
    public void downloadFile(String fileDate, String fileName, HttpServletResponse response) {
        String filePath = ROOT_PATH + File.separator + fileDate+File.separator + fileName;
        // 判断下载的文件是否存在
        if (!FileUtil.exist(filePath)) {
            throw new ServiceException(HttpCodeEnum.FILE_DISAPPEAR_ERROR_NEW);
        }
        byte[] bytes = FileUtil.readBytes(filePath);
        ServletOutputStream outputStream = null;
        // 数组是一个字节数组,也就是文件的字节流数组
        try {
            outputStream = response.getOutputStream();
            outputStream.write(bytes);
            outputStream.flush();
            outputStream.close();
        } catch (IOException e) {
            throw new ServiceException(HttpCodeEnum.FILE_DOWNLOAD_ERROR_NEW);
        }
    }

}

PathUtils类

public class PathUtils {

    public static String generateFilePath(String fileName){
        //uuid作为文件名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        //后缀和文件后缀一致,获取文件.jpg
        int index = fileName.lastIndexOf(".");
        // test.jpg -> .jpg
        String fileType = fileName.substring(index);
        return new StringBuilder().append(uuid).append(fileType).toString();
    }
}

结果返回类R

/**
 * 统一结果返回类
 *
 * @param <T>
 */
@Data
public class Result<T> implements Serializable {

    private static final long serialVersionUID = -3373652430525625264L;

    private Integer code;
    private String msg;
    private T data;

    /**
     * 成功时返回数据
     *
     * @param object 参数
     * @param <T>    类型
     * @return 返回
     */
    public static <T> Result<T> success(T object) {
        Result<T> r = new Result<T>();
        r.data = object;
        r.code = HttpCodeEnum.SUCCESS.getCode();
        r.msg = HttpCodeEnum.SUCCESS.getMsg();
        return r;
    }

    /**
     * 失败时返回信息
     *
     * @param httpCodeEnum 参数
     * @param <T>          类型
     * @return 返回
     */
    public static <T> Result<T> failure(HttpCodeEnum httpCodeEnum) {
        Result<T> r = new Result<T>();
        r.data = null;
        r.msg = httpCodeEnum.getMsg();
        r.code = httpCodeEnum.getCode();
        return r;
    }

    public static <T> Result<T> error(String msg, Integer code) {
        Result<T> r = new Result<T>();
        r.data = null;
        r.msg = msg;
        r.code = code;
        return r;
    }

}

枚举类

@Getter
public enum HttpCodeEnum {
    SUCCESS(200, "请求成功"),
    FILE_UPLOAD_ERROR_NEW(208, "文件上传失败"),
    FILE_DISAPPEAR_ERROR_NEW(209, "文件不存在"),
    FILE_DOWNLOAD_ERROR_NEW(210, "文件下载失败"),
    ADMIN_ERROR_NEW(211, "保存失败"),
    FILE_TYPE_ERROR_NEW(212, "上传文件类型错误,请上传png或jpg类型的图片")
    ;

    private final Integer code;
    private final String msg;

    HttpCodeEnum(Integer code, String msg) {
        this.code = code;
        this.msg = msg;
    }

}

时间:2024-02-27 晚上

posted @   有何和不可  阅读(1937)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示