使用Spring框架实现文件上传
在Java中实现文件的上传有多种方式,如smartUpload或是使用Strus2,本文与大家分享使用Spring框架中的MultipartFile类来实例文件的上传。
不啰嗦了,直接上干货。先是编写了一个实现文件上传的类FileUploadingUtil,此类中定义了两个对外公开的方法,upload和getFileMap。
前者需要传入一个Map参数,是用户提交的表单中的文件列表,最终返回值的也是一个Map类型对象,其键名为上传的文件名称,键值为文件在服务器上的存储路径;后者主要是用于测试用途,非主要功能,看官可以忽略此方法。
package com.emerson.cwms.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import org.springframework.web.multipart.MultipartFile; /** * 文件上传工具类 * * @author Chris Mao(Zibing) * */ public class FileUploadingUtil { /** * 服务器上的保存路径,在使用到上传功能的Controller中对其进行赋值 */ public static String FILEDIR = null; /** * 上传多个文件,返回文件名称和服务器存储路径列表 * * @param files * @return * @throws IOException */ public static Map<String, String> upload(Map<String, MultipartFile> files) throws IOException { File file = new File(FILEDIR); if (!file.exists()) { file.mkdir(); } Map<String, String> result = new HashMap<String, String>(); Iterator<Entry<String, MultipartFile>> iter = files.entrySet().iterator(); while (iter.hasNext()) { MultipartFile aFile = iter.next().getValue(); if (aFile.getSize() != 0 && !"".equals(aFile.getName())) { result.put(aFile.getOriginalFilename(), uploadFile(aFile)); } } return result; } /** * 上传单个文件,并返回其在服务器中的存储路径 * * @param aFile * @return * @throws FileNotFoundException * @throws IOException */ private static String uploadFile(MultipartFile aFile) throws IOException { String filePath = initFilePath(aFile.getOriginalFilename()); try { write(aFile.getInputStream(), new FileOutputStream(filePath)); } catch (FileNotFoundException e) { logger.error("上传的文件: " + aFile.getName() + " 不存在!!"); e.printStackTrace(); } return filePath; } /** * 写入数据 * * @param in * @param out * @throws IOException */ private static void write(InputStream in, OutputStream out) throws IOException { try { byte[] buffer = new byte[1024]; int bytesRead = -1; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } out.flush(); } finally { try { in.close(); out.close(); } catch (IOException ex) { } } } /** * 遍历服务器目录,列举出目录中的所有文件(含子目录) * @return */ public static Map<String, String> getFileMap() { logger.info(FileUploadingUtil.FILEDIR); Map<String, String> map = new HashMap<String, String>(); File[] files = new File(FileUploadingUtil.FILEDIR).listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { File[] files2 = file.listFiles(); if (files2 != null) { for (File file2 : files2) { String name = file2.getName(); logger.info(file2.getParentFile().getAbsolutePath()); logger.info(file2.getAbsolutePath()); map.put(file2.getParentFile().getName() + "/" + name, name.substring(name.lastIndexOf("_") + 1)); } } } } } return map; } /** * 返回文件存储路径,为防止重名文件被覆盖,在文件名称中增加了随机数 * @param name * @return */ private static String initFilePath(String name) { String dir = getFileDir(name) + ""; File file = new File(FILEDIR + dir); if (!file.exists()) { file.mkdir(); } Long num = new Date().getTime(); Double d = Math.random() * num; return (file.getPath() + "/" + num + d.longValue() + "_" + name).replaceAll(" ", "-"); } /** * * @param name * @return */ private static int getFileDir(String name) { return name.hashCode() & 0xf; } }
Controller代码,使用上述定义的FileUploadingUtil类实现文件上传之功能。
package com.emerson.cwms.web; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.MultipartHttpServletRequest; import com.emerson.cwms.utils.FileUploadingUtil; /** * 文件上传控制器 * * @author Chris Mao(Zibing) * */ @Controller @RequestMapping(value = "/files") public class FileController { @RequestMapping(value = "/", method = RequestMethod.GET) public String list(HttpServletRequest request, HttpServletResponse response, Model model) { iniFileDir(request); System.out.println(request.getAttribute("files")); model.addAttribute("files", FileUploadingUtil.getFileMap()); return "files/list"; } @RequestMapping(value = "/upload", method = RequestMethod.POST) public String doUpload(HttpServletRequest request) { iniFileDir(request); try { MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; Map<String, String> uploadedFiles = FileUploadingUtil.upload(mRequest.getFileMap()); Iterator<Entry<String, String>> iter = uploadedFiles.entrySet().iterator(); while (iter.hasNext()) { Entry<String, String> each = iter.next(); System.out.print("Uploaded File Name = " + each.getKey()); System.out.println(", Saved Path in Server = " + each.getValue()); } } catch (Exception e) { e.printStackTrace(); } return "redirect:/files/"; } private void iniFileDir(HttpServletRequest request) { FileUploadingUtil.FILEDIR = request.getSession().getServletContext().getRealPath("/") + "files/"; if (FileUploadingUtil.FILEDIR == null) { FileUploadingUtil.FILEDIR = request.getSession().getServletContext().getRealPath("/") + "files/"; } } }
注意事项:一定要在pom.xml文件中添加对commons-fileupload的依赖引用,否则代码在运行时会提示找不到FileItemFactory类的错误。
依赖引用如下。
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency>
相关推荐
使用Spring MVC进行上传下载 , 图片上传,多图片 同时上传
例如MSDN 的资源上传,yahoo邮箱的附件上传,论坛的附件上传等,文件上传的方式有很多种,例如,使用Struts框架实现文件上传,在JSP中使用jspSmartUpload 组件实现文件上传和使用Spring框架实现文件上传等
ssm框架实现的文件上传,自带数据库脚本,使用的是mysql,开发工具是myeclipse,简单操作,readme,有详细介绍。一看就会。
基于HT T P 传输协议, 采用Struts2 框架整合Spring 框架技术对Web 中文件的上传下载进 行应用研究. 提出的技术整合方案结合了...比较, 展示了Struts2 在文件上传下载应用中的优势, 并例举了一个实际应用项目的成功案例.
主要为大家详细介绍了Spring框架实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基于SpringBoot的文件上传系统,前后端分离,单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传 项目经过严格测试,确保可以运行! 采用前后端分离的方式进行开发,实现了几种常用的文件上传功能...
该框架是由Spring+Springmvc+mybatis三者整合,内含数据库。代码内部有详细的注释,适合中小型项目的开发,初学者学习使用。多文件上传直接可以使用。
运用struts+spring框架实现的OA办公系统 (由于上传文件大小受限,框架的jar包删了,只要导入struts+spring的框架包即可)
适用于初学者理解spring、springmvc、jdbctemplate,使用oracle数据库,实现单表增删改查、条件查询和分页、文件上传
Spring Boot实现文件上传和下载过程如下: 文件上传: 添加Web依赖,创建一个Controller类。 添加处理文件上传的POST请求方法,使用MultipartFile接收上传文件。 验证文件,保存到服务器文件系统。 返回响应给客户端...
下面是关于Spring MVC实现文件上传的详细描述: Spring MVC文件上传的实现步骤如下: 准备MultipartResolver: 在Spring MVC中,文件上传需要一个MultipartResolver来解析上传的文件。常用的MultipartResolver实现...
写的比较简陋,,基于struts1.2+spring2.0+hibernate3.1框架 基本功能: 注册,登陆,validate框架验证,文件上传,下载,简单过滤器,权限限制,下载列表查看,下载历史记录查看 未处理中文,所有jar包...
基于struts2 框架的文 件上传 copy 模式 字节流上传 字符流上传
文件上传客户端表单需要满足: 1、表单项type=“file” 2、表单的提交方式是post 3、表单的enctype属性是:enctype=“multipart/form-data” 选择了一个文件,点击上传,我们会把这个请求提交,选择了文件,把所有的...
spring-framework完整源代码(spring框架源码) 完整的Spring工程源码,工程内内包括spring各模块源码 以下为spring工程源码包结构: spring-src org.springframework aop,beans,cache,context,core,dao,ejb,...
适用于初学者理解spring、struts2、mybatis,使用oracle数据库,实现单表增删改查、条件查询和分页、文件上传
主要介绍了SpringMVC 文件上传配置,详解介绍了如何使用SpringMVC进行表单上的文件上传以及多个文件同时上传的步骤,有兴趣的可以了解一下
实现文件上传的思路: 1、创建form表单,enctype=“multipart/form-data(二进制)”,method=“post”,type=“file”。 2、开发控制器controller,控制器方法中的参数用:MultipartFile,进行文件的接收。 3、在...
Spring Boot实现文件上传和下载过程如下: 文件上传: 添加Web依赖,创建一个Controller类。 添加处理文件上传的POST请求方法,使用MultipartFile接收上传文件。 验证文件,保存到服务器文件系统。 返回响应给客户端...
spring-framework完整源代码(spring框架源码) 完整的Spring工程源码,工程内内包括spring各模块源码 以下为spring工程源码包结构: spring-src org.springframework aop,beans,cache,context,core,dao,ejb,...