Apache FileUpload组件

Apache FileUpload组件用于处理HTTP协议中的文件上传功能。本文详细介绍了如何在服务器端使用FileUpload解析请求,将上传文件封装成FileItem对象,并提供了解析上传数据、设置文件大小限制及临时存储路径的方法。此外,还讨论了DiskFileItemFactory和ServletFileUpload类的使用,以及性能优化的FileItemStream。最后提到了资源清理和进度监听器的实现。
在最初的 http 协议中,没有上传文件方面的功能。RFC1867("Form-based File Upload in HTML".)为 http 协议添加了这个功能。客户端的浏览器,如 Microsoft IE, Mozila, Opera 等,按照此规范将用户指定的文件发送到服务器。服务器端的网页程序,如 php, asp, jsp 等,可以按照此规范,解析出用户发送来的文件。

1.1、客户端
简单来说,RFC1867规范要求http协议增加了file类型的input标签,用于浏览需要上传的文件。同时要求FORM表单的enctype属性设置为“multipart/form-data”,method属性设置为“post”即可,下面是我们文。
件上传页面的表单代码:
  method="post" 
  enctype="multipart/form-data">
File1:
Desc:
### 判断 multipart/form-data 请求数据为空的方法 在禁用了 `fileupload` 拦截器且未使用 `CommonsMultipartResolver` 的前提下,若发现 `ServletFileUpload.parseRequest(request)` 返回的 `FileItem` 列表为空,可以采用以下方式判断请求中是否确实没有上传数据: 1. **检查请求头中的 `Content-Type` 是否为 `multipart/form-data`** 若请求头未正确设置为 `multipart/form-data`,则不能保证上传数据的正确性。可通过如下代码判断: ```java String contentType = request.getContentType(); if (contentType == null || !contentType.startsWith("multipart/form-data")) { // 请求类型不匹配,非 multipart/form-data } ``` 2. **使用 `ServletFileUpload.isMultipartContent(request)` 方法** Apache Commons FileUpload 提供了静态方法用于判断请求是否为 multipart 类型: ```java if (!ServletFileUpload.isMultipartContent(request)) { // 请求不是 multipart 类型,无法解析上传数据 } ``` 若返回 `false`,则说明请求中不包含上传数据或请求格式错误 [^1]。 3. **尝试解析请求并检查返回结果** 即使已确认请求为 multipart 类型,仍需实际解析请求内容以确认是否包含数据: ```java ServletFileUpload upload = new ServletFileUpload(); List<FileItem> items = upload.parseRequest(request); if (items == null || items.isEmpty()) { // 上传数据为空,可能请求已被封装或流被提前读取 } ``` 若返回的 `items` 为空或长度为 0,则说明上传数据未被正确解析 [^1]。 --- ### 替代 `upload.parseRequest(request)` 的解析方法 在无法使用 `upload.parseRequest(request)` 的情况下,可以尝试通过 `HttpServletRequest` 的 `getParts()` 方法解析上传数据,前提是运行环境支持 Servlet 3.0 及以上版本,并且容器(如 Tomcat、Jetty)未禁用 multipart 自动解析功能: ```java Collection<Part> parts = request.getParts(); if (parts == null || parts.isEmpty()) { // 上传数据为空 } else { for (Part part : parts) { String name = part.getName(); String fileName = part.getSubmittedFileName(); if (fileName != null && !fileName.isEmpty()) { // 文件上传字段 InputStream fileContent = part.getInputStream(); // 处理文件内容 } else { // 普通表单字段 BufferedReader reader = new BufferedReader(new InputStreamReader(part.getInputStream(), StandardCharsets.UTF_8)); String value = reader.lines().collect(Collectors.joining("\n")); // 处理普通字段值 } } } ``` 该方法依赖容器自身的 multipart 解析机制,适用于未使用 `CommonsMultipartResolver` 的场景 [^2]。 如果容器未正确配置 `MultipartConfigElement`,将导致 `getParts()` 返回 `null` 或抛出异常。此时应确保在 `web.xml` 中配置如下内容: ```xml <filter> <filter-name>multipartFilter</filter-name> <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> </filter> <filter-mapping> <filter-name>multipartFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 或在 Spring Boot 中通过编程方式配置: ```java @Bean public MultipartConfigElement multipartConfigElement() { return new MultipartConfigElement(""); } ``` 此方法可作为 `ServletFileUpload` 的替代方案,尤其在禁用默认文件上传拦截器的情况下 [^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huangleijay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值