Ø 在Spring MVC中处理已经上传的文件十分容易。上传到Spring MVC应用程序中的文件会被包在一个MultipartFile对象中。你唯一的任务就是用类型为MultipartFile的属性编写一个domain类。 Ø org.springframework.web.multipart.MultipartFile接口具有以下方法: l byte[] getBytes(),它以字节数组的形式返回文件的内容。 l String getContentType(),它返回文件的内容类型。 l InputStream getInputStream(),它返回一个InputStream,从中读取文件的内容。 l String getName(),它以多部分的形式返回参数的名称。 l String getOriginalFilename(),它返回客户端本地驱动器中的初始文件名。 l long getSize(),它以字节为单位,返回文件的大小。 l boolean isEmpty(),它表示被上传的文件是否为空。 l void transferTo(File destination),他将上传的文件保存到目标目录下。 Ø 只有实现了Servlet3.0及其更高版本规范的Servlet容器,才支持文件上传。对版本低于Servlet3.0的容器,则需要Apache CommonsFileUpload元件,它可以从以下网页下载: http://commons.apache.org/proper/commons-fileupload/,这是一个开源项目,因此是免费的,它还提供了源代码。为了让Commons FileUpload成功地工作,还需要另一个Apache Commons元件:Apache Commons IO。从以下网页可以下载到ApacheCommons IO:http://commons.apache.org/proper/commons-io/。因此,需要将两个JAR文件复制到应用程序的WEB-INF/lib目录下。CommonsFileUpload JAR的名称遵循以下模式:commons-fileupload-x.y.jar,这里的x是指该软件的最高版本,y是指最低版本。例如,本章使用的名称是commons-fileupload-1.3.jar。Commons IO JAR的名称遵循以下模式:commons-io-x.y.jar,这里的x是指该软件的最高版本,y是指最低版本。例如,本章使用的名称是commons-io-2.4.jar。 Ø 此外,还需要在SpringMVC配置文件中定义multipartResolver bean。 <beanid=”multipartResolver” class=”org.springframework.web.multipart.commons.CommonsMultipartResolver”> <property name=”maxUploadSize” value=”2000000”/>
</bean> Ø 有了Servlet3,就不需要CommonsFileUpload和Commons IO元件了。在Servlet3及其以上版本的容器中进行服务器端文件上传的编程,是围绕着标注类型MultipartConfig和javax.servlet.http.Part接口进行的。处理已上传文件的Servlets必须以@MultipartConfig进行标注。 Ø 下列是可能在MultipartConfig标注类型中出现的属性,他们都是可选的: l maxFileSize(最大文件大小):上传文件的最大容量,默认值为-1,表示没有限制。大于指定值的文件将会遭到拒绝。 l maxRequestSize(最大请求大小):表示多部分HTTP请求允许的最大容量,默认值为-1,表示没有限制。 l location(保存的目标位置):表示在Part接口调用write方法时,要将已上传的文件保存到磁盘中的位置。 l fileSizeThreshold:上传文件超出这个容量界限时,会被写入磁盘。 Ø Spring MVC的DispatcherServlet(调度员servlet)处理大部分或者所有请求。令人遗憾的是,如果不修改源代码,将无法对Servlet进行标注(@MultipartConfig)。但值得庆幸的是,Servlet3中有一种比较容易的方法,能使一个Servlet变成一个MultipartConfigServlet,即给部署描述符(web.xml)中的Servlet声明赋值。以下代码与用@MultipartConfig给DispatcherServlet进行标注的效果一样。(一个Servlet可以有3个名字:客户知道的URL名,部署人员知道的秘密内部名和实际的文件名) <servlet> <!—内部部署名和实际类名--> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!—非默认的SpringMVC配置文件名称及路径--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/springmvc-config.xml</param-value> </init-param> <!—给该Servlet(DispatcherServlet声明赋值),使其变成一个MultipartConfig标注的Servlet--> <multipart-config> <max-file-size>20848820(20M左右)</max-file-size> <max-request-size>418018841(400M左右)</max-request-size> <file-size-threshold>1048576</file-size-threshold> </multipart-config> </servlet> Ø 此外,还需要在Spring MVC配置文件中使用一个不同的多部分解析器,像下面这样: <beanid=”multipartResolver” class=”org.springframework.web.multipart.support.StandardServletMultipartResolver”> </bean> Ø app11b应用程序展示了如何在Servlet3及其更高版本的容器中处理文件上传问题。这是从app11a改写过来的,因此,domain和controller类都非常相似。唯一的区别在于,现在的web.xml文件中包含了一个multipart-config元素。清单11.6展示了app11b的web.xml文件。
|