文件上传/下载

springboot上传/下载

一、文件上传,springboot-web依赖有:MultipartFile

  1、真实名称和保存名称都可以存数据库,避免有的需求需要原样上传名称;

  2、保存最好不要有IP,维护的坑不少

  3、上传大小需要配置一下,不然超过Tomcat默认值就异常(下方配置)

  4、采用年/月/日文件夹存储,上传量大的情况可以精确到时/分文件夹

  5、对废弃文件可以搞一个定时清理,条件自定,且对账号限制上传存储大小,避免非法对系统各种上传  

spring:
  servlet:
    multipart:
      max-file-size: 10485760

 

    @PostMapping("/upload")
    public void upload(@RequestParam("file")MultipartFile[] multipartFile) {
        Map<String, Object> map = new HashMap<>();
        if(multipartFile.length > 4) log.info("一次最多不超过4个文件");
        for(MultipartFile file : multipartFile) {
            if(file.getSize() > 1024 * 1024 * 5) log.info("大小不超过5M");
            String fileName = file.getOriginalFilename();// 上传真实文件名
            String fileTypes[] = {".jpg", ".jpeg", ".bmp", ".png", ".pdf", ".doc", ".docx", ".ppt", ".pptx", ".zip", ".rar", ".xlsx", ".xls"};
            String fileType = fileName.substring(fileName.lastIndexOf(".")); //获取后缀
            if(!isFile(fileTypes, fileType)) log.info("文件格式不支持");
            String dateYMD = this.getDateYMD("yyyy-MM-dd"); //保存在磁盘的随机名字
            String[] splitDate = dateYMD.split("-");
            String fileUri = Integer.parseInt(splitDate[0]) + "/" + Integer.parseInt(splitDate[1]) + "/" + Integer.parseInt(splitDate[2]);
            File path = new File(uploadFolder+fileUri);
            if(!path.exists()) path.mkdirs();
            String fileUUID = IdWorker.getIdStr() + fileType;//保存在磁盘的随机名字
            File dir = new File(path, fileUUID);
            try {
                file.transferTo(dir);
            } catch(Exception e) {
                log.info("上传失败");
            }
            map.put("src", "127.0.0.1/upload/" + fileUri + "/" + fileUUID);//多个可存list用于前端展示
        }
        log.info("上传成功");
    }
    //判断后缀文件类型匹配
    private boolean isFile(String[] fileTypes, String fileType) {
        boolean flag = false;
        for(int i = 0; i < fileTypes.length; i++) {
            if(fileTypes[i].equalsIgnoreCase(fileType)) {
                flag = true;
                break;
            }
        }
        return flag;
    }    
    public static String getDateYMD(String formStyle) {
        SimpleDateFormat format = new SimpleDateFormat(formStyle);
        return format.format(new Date());
    }

二、文件下载

  1、给前端返回可以访问的路径即可如:http://127.0.0.1/upload/yyyy/mm/dd/1262592400254103554.jpg 如:window.location.href = '资源地址'

  2、输出输出流将制定路径下的文件进行输出下载,不太实用,省略

三、配置文件

  1、application.yml配置上传文件相关

file:
  path: /upload/**
  address: c:\\upload\\ #/opt/project/upload/

  2、配置文件磁盘url 映射,配置server虚拟路径

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Value("${file.path}")
    private String path;    
    @Value("${file.address}")
    private String address;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // handler为前台访问的目录,locations为files相对应的本地路径        
     registry.addResourceHandler(path).addResourceLocations("file:"+address);
    }
}

 

posted on 2020-05-18 17:55  fuanfei  阅读(136)  评论(0)    收藏  举报