重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章给大家分享的是有关利用Spring MVC怎么实现一个文件上传功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
创新互联成立与2013年,先为祥符等服务建站,祥符等地企业,进行企业商务咨询服务。为祥符企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
1、使用Spring MVC 上传文件必须配置文件解析器,如下:
2、建立上传文件表单代码,其中要注意form表单中的enctype 属性,必须存在且必须为multipart/form-data。还有当form中存在button标签时,用ajax异步提交表单后,也面会被刷新。原因:button 存在时会再次提交一下表单,所以页面被刷新了。
3.1、使用CommonsMultipartFile接收上传文件,其中要注意的是:方法中CommonsMultipartFile对应的变量名如果不是对应表单中文件输入框的名称就必须加上@RequestParam("txtFile") 强制注入。
/** * @Description: 通过文件流的形式上传 * @param file @RequestParam("txtFile") 将name=txtFile控件得到的文件封装成CommonsMultipartFile对象, * 如果不这样做会报CommonsMultipartFile没有初始化的错误 * java.lang.NoSuchMethodException: org.springframework.web.multipart.commons.CommonsMultipartFile.() * @return * @author yuanfy * @date 2017年9月15日 下午4:36:11 * @version 6.5 */ @RequestMapping(value="test/upload1") @ResponseBody public String testUpload1(@RequestParam("txtFile")CommonsMultipartFile file){ Long times = System.currentTimeMillis(); if (file == null) { return null; } StringBuilder fileContent = new StringBuilder(); //1、获取文件信息 FileUtils.getFileInfo(file, fileContent); //2、上传文件并获取文件内容 try { file.transferTo(new File("F:\\text.log"));//另存文件 fileContent.append(FileUtils.getFileContentByLine(file.getInputStream())); } catch (IOException e) { return "获取文件内容失败"; } //3、返回文件信息和内容 String content = fileContent.toString(); content = content.replace("times", (System.currentTimeMillis()-times) + "ms"); return content; }
界面效果图如下:
3.2、使用CommonsMultipartResolver获取存放文件对象,拿到文件对象后遍历每个文件上传及获取相关的内容。
@RequestMapping(value="test/upload2") @ResponseBody public String testUpload2(HttpServletRequest request){ Long times = System.currentTimeMillis(); StringBuilder fileContent = new StringBuilder(); //1.根据servletContext获取多文件上传解析组件 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); if (!multipartResolver.isMultipart(request)) { return "不是上传文件表单,请检查表单属性"; } //2.将请求对象转换为多文件请求对象。 MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; //3、根据多文件请求对象获取文件存放Map MapfileMap = multipartHttpServletRequest.getFileMap(); Iterator > iterator = fileMap.entrySet().iterator(); //4、迭代文件Map,获取具体的MultipartFile while (iterator.hasNext()) { Entry entry = iterator.next(); MultipartFile multipartFile = entry.getValue(); //获取文件头信息 FileUtils.getFileInfo(multipartFile, fileContent); try { //上传文件 multipartFile.transferTo(new File("F:\\text.log")); //获取文件内容 fileContent.append(FileUtils.getFileContentByLine(multipartFile.getInputStream())); }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //5、返回文件信息和内容 String content = fileContent.toString(); content = content.replace("times", (System.currentTimeMillis()-times) + "ms"); return content; }
其中第一步获取文件解析器对象应该都清楚只要在容器中配置了对应的对象我们就可以获取到它,而它有根据上下文获取的构造函数就方便多了。
/** * Constructor for standalone usage. Determines the servlet container's * temporary directory via the given ServletContext. * @param servletContext the ServletContext to use */ public CommonsMultipartResolver(ServletContext servletContext) { this(); setServletContext(servletContext); }
然后根据request判断是否还有上传文件的表单,如果不是肯定直接返回,我们看看源码中是怎么判断的。
//CommonsMultipartResolver.class 主要判断request是否为空 @Override public boolean isMultipart(HttpServletRequest request) { return (request != null && ServletFileUpload.isMultipartContent(request)); } //ServletFileUpload 主要判断是否是post方法,因为上传文件必须是post提交,其实我们可以在我们自定义controller中的方法指定访问 public static final boolean isMultipartContent(HttpServletRequest request) { if (!POST_METHOD.equalsIgnoreCase(request.getMethod())) { return false; } return FileUploadBase.isMultipartContent(new ServletRequestContext(request)); } //FileUploadBase.class 如果请求是MULTIPART 则返回true public static final boolean isMultipartContent(RequestContext ctx) { String contentType = ctx.getContentType();//类似:multipart/form-data; boundary=----WebKitFormBoundaryLF3eM94lDB0ocQxT if (contentType == null) { return false; } if (contentType.toLowerCase(Locale.ENGLISH).startsWith(MULTIPART)) { return true; } return false; }
所以如果request是上传文件的请求对象,则进行第二步。将request转换成多文件请求对象,然后获取存放文件的map。
可想而知这种方法效率是比第一种要低的,因为他要遍历文件map,但是在Spring MVC常用的却是这种方法。
效果图如下:
其中FileUtils.java代码如下:
package com.yuanfy.monitorsite.common.util; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; /** * @Description: 文件工具类方法 * @author yuanfy * @date 2017年9月15日 下午2:45:40 * @version 1.0 */ public class FileUtils { /** * @Description: 获取文件信息 * @param file CommonsMultipartFile类型的文件 * @param fileContent StringBuilder,封装文件信息 * @author yuanfy * @date 2017年9月15日 下午2:51:34 * @version 1.0 */ public static void getFileInfo(MultipartFile file, StringBuilder fileContent) { fileContent.append("文件名称:\t\t").append(file.getName()).append("\n") .append("文件原始名称:\t").append(file.getOriginalFilename()).append("\n") .append("文件大小:\t\t").append(file.getSize()).append("\n") .append("文件类型:\t\t").append(file.getContentType()).append("\n") .append("读取文件时长:\t times").append("\n"); } /** * @Description: 根据文件对象获取文件内容 * @param file * @author yuanfy * @date 2017年9月15日 下午5:01:57 * @version 1.0 * @throws IOException * @throws FileNotFoundException */ public static String getFileContentByLine(File file) throws FileNotFoundException, IOException { return getFileContentByLine(new FileInputStream(file)); } /** * @Description: 根据文件输入流对象获取文件内容 * @param in 文件输入流对象 * @author yuanfy * @date 2017年9月15日 下午5:01:57 * @version 1.0 * @throws IOException */ public static String getFileContentByLine(InputStream in) throws IOException { StringBuilder fileContent = new StringBuilder(); byte[] bytes = new byte[1024]; int len = 0; while ((len = in.read(bytes)) != -1) { String content = new String(bytes, 0, len, "UTF-8"); fileContent.append(content); } StreamUtils.close(in); return fileContent.toString(); } }
以上就是利用Spring MVC怎么实现一个文件上传功能,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。