SpringBoot ~ 文件上传
文件上传
SpringBoot中对文件上传做了简化,使文件上传变得非常方便,以下分享前后端分离的情况下单文件上传与多文件上传的写法。
-
依赖添加(pom.xml)(基本依赖)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
配置
Java中文件上传涉及2个组件,其一是基于commons-fileupload的CommonsMutipartResolver来处理multipart请求,其二是基于Servlet 3.0的StandardServletMultipartResolver来处理multipart请求。Tomcat7开始支持Servlet 3.0,所以SpringBoot内嵌了Tomcat,SpringBoot提供的文件上传自动化配置类MultipartAutoConfiguration,如果开发者未提供MultipartResolver,默认也采用StandardServletMultipartResolver组件,所以SpringBoot文件上传可以做到零配置。
-
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
-
-
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; } }
-
静态资源访问路径配置
如果上传资源需要被访问,则须配置上传文件路径添加静态资源访问路径。
注意:在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); } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Python一行代码过滤标点符号等特殊字符
本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 很多时候我们需要过滤掉标点符号等特殊字符,网上虽然有一堆的方法,但是都没有找到一个非常满意的,有些过滤不了中文的标点符号,有些过滤不了英文的标点符号,有些过滤不全。 最后通过查看正则表达式文档,发现一个高效的办法,一行代码就能搞定: def replace_all_blank(value): """ 去除value中的所有非字母内容,包括标点符号、空格、换行、下划线等 :param value: 需要处理的内容 :return: 返回处理后的内容 """ # \W 表示匹配非数字字母下划线 result = re.sub('\W+', '', value).replace("_", '') print(result) return result 其中用到了Python的re模块,re模块里面包含了所有的正则表达式的应用。代码里面有几个点: re.sub(参数1,参数2,参数3)方法,表示匹配到以后替换。其中参数1表示正则匹配的模式,参数2表示匹配到以后用参数2替换原内...
- 下一篇
SpringBoot ~ 同源策略配置
CROS(Cross-Origin Resource Sharing)是由W3C制定的一种跨域资源共享技术标准,其目的就是为了解决前端的跨域请求。 SpringBoot配置跨域有2种方式,一是方法注解配置,二是全局配置 注解配置 @RestController @RequestMapping("/cors") public class RestfulCorsController { @RequestMapping("/") @CrossOrigin(value = "http://localhost:5000",allowedHeaders = "*",maxAge = 1800) public Map<String,String> itemOperator(@RequestBody ModelMap params){ Map<String,String> map = new HashMap<>(); map.put("name", (String) params.get("name")); System.out.println(params); r...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS关闭SELinux安全模块
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路