同福

SpringBoot实现文件上传的方法

介绍

介绍

福哥在做SpringBoot开发的时候,需要设计一个允许用户上传文件的接口,发现使用SpringBoot上传文件还是有一点复杂的。所以,福哥就把使用SpringBoot实现文件上传功能的教程记录了下来,分享给大家!

配置

在application.properties里面增加下面的设置

# 开启文件上传
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0

# 上传文件的临时保存目录
spring.servlet.multipart.location=/tmp/

# 暂时不知道
spring.servlet.multipart.resolve-lazily=true

# 单个上传文件尺寸上限
spring.servlet.multipart.max-file-size=100MB

# 全部上传文件尺寸上限
spring.servlet.multipart.max-request-size=1000MB

代码

单文件上传

随便建立一个控制器,在里面写上如下代码

@RequestMapping("/me/icon/_upload")
public IconUploadResult postCompanyIconUpload(
        @RequestParam("file") MultipartFile file
){
    IconUploadResult iconUploadResult = new IconUploadResult();

    if(file.isEmpty()){
        iconUploadResult.setErrcode(1021011);
        iconUploadResult.setErrmsg("upload file is empty");

        return iconUploadResult;
    }

    String fileName = file.getOriginalFilename();
    String saveFileDirPath = "/tongfu.net/web/images/icon/";
    File saveFile = new File(saveFileDirPath + fileName);

    try{
        file.transferTo(saveFile);
    }
    catch (IOException e){
        iconUploadResult.setErrcode(1021012);
        iconUploadResult.setErrmsg("failed to upload");

        return iconUploadResult;
    }

    iconUploadResult.setErrcode(0);
    iconUploadResult.setErrmsg("OK");

    return iconUploadResult;
}

多文件上传

还用刚刚的控制器,把内容改一改。这次需要使用Servlet获取上传文件了。

@RequestMapping("/me/company/icon/_upload")
public IconUploadResult postCompanyIconUpload(

){
    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    HttpServletRequest request = attributes.getRequest();
    List<MultipartFile> file = ((MultipartHttpServletRequest) request).getFiles("file");
    IconUploadResult iconUploadResult = new IconUploadResult();

    for(int i=0; i<file.size(); i++){
        MultipartFile myFile = file.get(i);

        if(myFile.isEmpty()){
            iconUploadResult.setErrcode(1021011);
            iconUploadResult.setErrmsg("upload file is empty");

            return iconUploadResult;
        }

        String fileName = myFile.getOriginalFilename();
        String saveFileDirPath = "/tongfu.net/web/images/icon/";
        File saveFile = new File(saveFileDirPath + fileName);

        try{
            myFile.transferTo(saveFile);
        }
        catch (IOException e){
            iconUploadResult.setErrcode(1021012);
            iconUploadResult.setErrmsg("failed to upload");

            return iconUploadResult;
        }
    }

    iconUploadResult.setErrcode(0);
    iconUploadResult.setErrmsg("OK");

    return iconUploadResult;
}

总结

大多数情况都是上传一个文件,这时候SpringBoot提供了很好封装,处理很方便了。但是,在处理多文件上传的时候(一样的表单元素名称的情况下)还是需要借助最基础的Servlet进行上传文件的获取。这就说明了,基础是很重要的。