Spring MVC框架的文件上传是基于commons-fileupload组件的文件上传,只不过Spring MVC框架在原有文件上传组件上做了进一步封装,简化了文件上传的代码实现,取消了不同上传组件上的编程差异。
由于Spring MVC框架是无法单独自己完成的,所以需要引入专门的文件上传jar包。文件上传是基于commons-fileupload组件的文件上传。因此,需要将commons-fileupload组件相关的jar(commons-fileupload-1.3.1.jar和commons-io-2.4.jar)拷贝到Spring MVC应用的WEB-INF/lib目录下。下面讲解一下如何下载相关jar包。 commons-fileupload组件可以从http://commons.apache.org/proper/commons-fileupload/上下载,本书采用的版本是1.3.1。下载它的Binaries压缩包(commons-fileupload-1.3.1-bin.zip),解压后的目录中有两个子目录,分别是lib和site。lib目录下有个JAR文件:commons-fileupload-1.3.1.jar,该文件是commons-fileupload组件的类库。site目录中是commons-fileupload组件的文档,也包括API文档。 commons-fileupload组件依赖于Apache的另外一个项目:commons-io,该组件可以从http://commons.apache.org/proper/commons-io/上下载,本书采用的版本是2.4。下载它的Binaries压缩包(commons-io-2.4-bin.zip),解压缩后的目录中有四个JAR文件,其中有一个commons-io-2.4.jar文件,该文件是commons-io的类库。
基于表单的文件上传,不要忘记使用enctype属性,并将它的值设置为multipart/form-data。同时,表单的提交方式设置为post。为什么需要这样呢?下面从enctype属性说起。 表单的enctype属性指定的是表单数据的编码方式,该属性有如下三个值: application/x-www-form-urlencoded:这是默认的编码方式,它只处理表单域里的value属性值。 multipart/form-data:该编码方式以二进制流的方式来处理表单数据,并将文件域指定文件的内容封装到请求参数里。 text/plain:该编码方式当表单的action属性为mailto:URL的形式时才使用,主要适用于直接通过表单发送邮件的方式。 由上面三个属性的解释可知,基于表单上传文件时,enctype的属性值应为multipart/form-data。
在Spring MVC框架中,上传文件时,将文件相关信息及操作封装到MultipartFile对象中。因此,开发者只需要使用MultipartFile类型声明模型类的一个属性,即可以对被上传文件进行操作。该接口具有如下方法: byte[] getBytes():以字节数组的形式返回文件的内容。 String getContentType():返回文件的内容类型。 InputStream getInputStream():返回一个InputStream,从中读取文件的内容。 String getName():返回请求参数的名称。 String getOriginalFilename():返回客户端提交的原始文件名称。 long getSize():返回文件的大小,单位为字节。 boolean isEmpty():判断被上传文件是否为空。 void transferTo(File destination):将上传文件保存到目标目录下。 上传文件时,需要在配置文件中使用Spring的org.springframework.web.multipart.commons.CommonsMultipartResolver类配置MultipartResolver 用于文件上传。
创建项目,将Spring MVC相关JAR包、commons-fileupload组件相关JAR包以及JSTL相关JAR包导入应用的lib中。
在WebContent目录下,创建JSP页面oneFile.jsp。
<form action="${pageContext.request.contextPath }/onefile" method="post" enctype="multipart/form-data"> 选择文件:<input type="file" name="myfile"> <br> 文件描述:<input type="text" name="description"> <br> <input type="submit" value="提交"> </form>
在src目录下,创建包pojo,在该包中创建POJO类FileDomain。在该POJO类中声明一个MultipartFile类型的属性,封装被上传的文件信息,属性名与文件选择页面oneFile.jsp中的file类型的表单参数名myfile相同。具体代码如下:
package pojo;
import org.springframework.web.multipart.MultipartFile;
public class FileDomain { private String description; private MultipartFile myfile; //省略setter和getter方法 }
在src目录下,创建controller包,并在该包中创建FileUploadController控制器类。
@RequestMapping("/onefile")
public String oneFileUpload(@ModelAttribute FileDomain fileDomain, HttpServletRequest request){
String realpath = request.getServletContext().getRealPath("uploadfiles");
String fileName = fileDomain.getMyfile().getOriginalFilename();
File targetFile = new File(realpath, fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
} //上传
try { fileDomain.getMyfile().transferTo(targetFile);
logger.info("成功"); }
catch (Exception e) { e.printStackTrace(); } return "showOne"; }
创建Spring MVC的配置文件
上传文件时,需要在配置文件中使用spring的CommonsMultipartResolver类 配置MultipartResolver 用于文件上传。
<!--使用Spring的CommosMultipartResolver,配置MultipartResolver 用于文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="UTF-8" p:maxUploadSize="5400000" p:uploadTempDir="fileUpload/temp" > <!--D:\spring mvc workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\fileUpload --> </bean> <!-- defaultEncoding="UTF-8" 是请求的编码格式,默认为iso-8859-1 maxUploadSize="5400000" 是允许上传文件的最大值,单位为字节 uploadTempDir="fileUpload/temp" 为上传文件的临时路径 -->
创建成功显示页面
<body> ${fileDomain.description }<br> <!-- fileDomain.getMyfile().getOriginalFilename() --> ${fileDomain.myfile.originalFilename } </body>