使用Servlet技术上传文件

43次阅读

共计 1616 个字符,预计需要花费 5 分钟才能阅读完成。

支持文件上传是 web 程序最基本和常见的需求。在早期的 servlet 规范中,实现文件上传需要使用第三方库或者复杂的输入处理。针对此问题,servlet 现在以通用和可移植的方式帮助提供了一个可行的解决方案。servlet 技术现在提供开箱即用的上传文件方法,所以任何实现规范的 web 容器都能通过 HttpServletRequest 对象解析 multipart 请求和生成有效的 mime 附件。
一个新的注解,javax.servlet.annotation.MultipartConfig,用来表明需要 multipart/form-data 类型请求的定义上。使用 @MultipartConfig 注解的 servlet 都可以通过调用 request.getPart(String name) 或 request.getParts() 方法获取一个给定的 multipart/form-data 请求中的 Part 构件。

@MultipartConfig 注解

@MultipartConfig 注解提供下面这些可选的属性:

  • location 操作系统上的一个绝对路径。location 属性不支持基于 web 上下文的相对路径。location 用来在处理 Part 时存储临时文件或者是文件大小超过 fileSizeThreshold 设置的值。默认 location 是“”
  • fileSizeThreshold 存储在硬盘上的临时文件的大小。默认是 0byte
  • MaxFileSize 允许上传的最大文件大小,单位是 byte。如果上传的文件超过限制,web 容器将抛出异常(IllegalStateException)。默认设置是不限制大小。
  • maxRequestSize 一个 multipart/form-data 请求能携带的最大字节数。

例如,@MultiPartConfig 可以如下构造:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024,
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

代替使用 @MultipartConfig 注解在你的 upload servlet 中硬编码这些属性,需要在 web.xml 中作为一个子节点添加下面的节点:

<multipart-config>
    <location>/tmp</location>
    <max-file-size>20848820</max-file-size>
    <max-request-size>418018841</max-request-size>
    <file-size-threshold>1048576</file-size-threshold>
</multipart-config>

getParts 和 getPart 方法

servlet 规范定义了 HttpServletRequest 的两个附加方法:

  • Collection<Part> getParts()
  • Part getPart(String name)

request.getParts() 方法返回所有 Prat 集合。如果你有超过一个文件类型的输入,将返回多个 Part 对象。因为所有 Part 对象都被命名,getPart(String name) 方法用来访问特定的 Part 对象。另外,getParts() 返回 Iterable<Part> 可以用来遍历所有 Part。
javax.servlet.http.Part 是简单的,提供每个 Part 的自省方法。方法列表:

  • 获取 Part 的名称、大小、类型等
  • 查询随 Part 提交的 Header 信息
  • 删除一个 Part
  • 输出 Part 到磁盘

例如,Part 接口提供 write(String filename) 方法以特定名称写入到文件中。文件可以使用 @MultipartConfig 注解定义的 location 直接保存,在 fileupload 示例中,location 是由表达中的属性定义的。

正文完
 0