您现在的位置是:首页 > 文章详情

SpringBoot ~ 文件上传

日期:2019-08-11点击:344

文件上传

SpringBoot中对文件上传做了简化,使文件上传变得非常方便,以下分享前后端分离的情况下单文件上传与多文件上传的写法。

  1. 依赖添加(pom.xml)(基本依赖)

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
  2. 配置

    ​ Java中文件上传涉及2个组件,其一是基于commons-fileupload的CommonsMutipartResolver来处理multipart请求,其二是基于Servlet 3.0的StandardServletMultipartResolver来处理multipart请求。Tomcat7开始支持Servlet 3.0,所以SpringBoot内嵌了Tomcat,SpringBoot提供的文件上传自动化配置类MultipartAutoConfiguration,如果开发者未提供MultipartResolver,默认也采用StandardServletMultipartResolver组件,所以SpringBoot文件上传可以做到零配置。

    1. application.properties配置(非必需)

      #配置文件上传 #是否开启文件上传支持,默认true spring.servlet.multipart.enabled=true #文件写入磁盘的阈值,默认为0 spring.servlet.multipart.file-size-threshold=0 #上传文件的临时保存位置 spring.servlet.multipart.location=D:\\data #上传的单个文件的最大大小,默认1MB spring.servlet.multipart.max-file-size=100MB #多文件上传时,文件的总大小,默认10MB spring.servlet.multipart.max-request-size=100MB #表示文件是否延迟解析,默认为false spring.servlet.multipart.resolve-lazily=false
  3. Controller

    package cn.wsyjlly.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * @author wsyjlly * @create 2019.06.13 - 17:23 **/ @RestController public class FileUploadController { private String fomartDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); private final String UPLOAD_PATH = "/uploadFiles/"; private final Integer SUCCESS = 1; private final Integer FAILURE = 0; private Logger logger = LoggerFactory.getLogger(getClass()); /* * 单文件上传 * */ @PostMapping("/upload") public ModelMap upload(MultipartFile uploadFile, HttpServletRequest request) { ModelMap map = new ModelMap(); if (uploadFile == null){ map.addAttribute("status",FAILURE); map.addAttribute("message","未选择文件"); return map; } File folder = getRootPath(); logger.debug("文件夹路径:"+folder.getAbsolutePath()); String originalFilename = uploadFile.getOriginalFilename(); logger.debug("文件原名:"+originalFilename); String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length()); try { uploadFile.transferTo(new File(folder,newName)); String filePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + UPLOAD_PATH + fomartDate+"/" + newName; logger.debug("文件访问路径:"+filePath); map.addAttribute("filePath",filePath); map.addAttribute("status",SUCCESS); return map; } catch (IOException e) { e.printStackTrace(); } map.addAttribute("status",FAILURE); return map; } /* * 多文件上传 * */ @PostMapping("/uploads") public ModelMap uploads(MultipartFile[] uploadFiles, HttpServletRequest request) { ModelMap map = new ModelMap(); logger.debug("文件个数:"+uploadFiles.length); //String realPath = ResourceUtils.getURL("classpath:").getPath()+UPLOAD_PATH; File folder = getRootPath(); HashMap<String, Map> fileListUploadStatus = new HashMap<>(); for (MultipartFile file:uploadFiles){ HashMap<String, Object> item = new HashMap<>(); String originalFilename = file.getOriginalFilename(); System.out.println("————————————————————————————————"); logger.debug("————————————————————————————————"); logger.debug("文件原名:"+originalFilename); logger.debug("文件大小:"+file.getSize()); logger.debug("文件类型:"+file.getContentType()); String newName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."), originalFilename.length()); try { file.transferTo(new File(folder,newName)); String filePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + UPLOAD_PATH + fomartDate+"/" + newName; logger.debug("访问地址:"+filePath); logger.debug("地址文件名:"+newName); item.put("isUpload",true); item.put("url",filePath); fileListUploadStatus.put(originalFilename,item); } catch (IOException e) { item.put("isUpload",false); item.put("url",""); fileListUploadStatus.put(originalFilename,item); e.printStackTrace(); } } map.addAttribute("resultList",fileListUploadStatus); return map; } private File getRootPath(){ File file = new File(System.getProperty("user.dir")+UPLOAD_PATH); if(!file.exists()){//如果文件夹不存在 file.mkdirs();//创建文件夹 } String rootPath = file.getAbsolutePath(); File folder = new File(rootPath+'/' + fomartDate); if (!folder.isDirectory()){ folder.mkdirs(); } return folder; } }
  4. 静态资源访问路径配置

    如果上传资源需要被访问,则须配置上传文件路径添加静态资源访问路径。

    注意:在Linux系统和window系统中相对于当前运行位置的盘的根路径都可表示为 ‘/’

    静态资源文件路径分为两种:

    • 相对路径(相对于classes的路径)即:'classpath:'
    • 绝对路径:文件系统路径,配置文件系统静态资源路径时须添加前缀:'file:'
    /** * @author wsyjlly * @create 2019.06.12 - 16:17 **/ @Configuration public class WebMvcConfig implements WebMvcConfigurer { private Logger logger = LoggerFactory.getLogger(getClass()); /* * 配置静态资源过滤策略 * 将静态资源路径映射为访问路径 * */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**") .addResourceLocations("classpath:/"); String uploadPath = new File(System.getProperty("user.dir"),"uploadFiles") .getAbsolutePath().replaceAll("\\\\","/")+"/"; registry.addResourceHandler("/uploadFiles/**"). addResourceLocations("file:"+uploadPath); logger.info("上传文件路径映射:/uploadFiles/** ————>> "+uploadPath); } }
原文链接:https://yq.aliyun.com/articles/713765
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章