开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 2157|回复: 0

Spring MVC中文件上传的常用方法

[复制链接]

0

精华

0

贡献

5

赞扬

帖子
3
软币
64
在线时间
2 小时
注册时间
2017-3-2
发表于 2017-3-2 19:48:43 | 显示全部楼层 |阅读模式
Ø  在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文件。


评分

参与人数 5赞扬 +5 收起 理由
kfzlt123 + 1 赞一个
123n + 1 很给力
rainday + 1 很给力
西米火山 + 1 淡定
zongheiseliuyue + 1 很给力

查看全部评分

回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-27 10:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表