初学Java Web(7)——文件的上传和下载

初学Java Web(7)——文件的上传和下载

文件上传 文件上传前的准备

在表单中必须有一个上传的控件
<input type="file"/>

因为 GET 方式有请求大小的限制,所以表单的提交方式必须是 POST
<form action="/upload" method="post">

表单默认的编码方式为 application/x-www-form-urlencoded ,应该修改为 multipart/form-data ,以二进制的形式进行数据的传输
<form action="/upload" method="post" enctype="multipart/form-data">

注意:此时 Servlet 中就不能再使用 request对象.getParameter(String name) 来获取请求参数

初学Java Web(7)——文件的上传和下载

上传组件

实现文件的上传,需要基于以下两种组件的一种:

Apache FileUpload 组件【操作比较复杂】

SmartUpload 组件【操作比较简单,但存在一些问题】

基于 FileUpload 组件

使用基于Apache FileUpload上传组件实现文件的上传,步骤:

将必要的 jar 包导入到项目中
commons-fileupload-1.2.2.jar
commons-io-1.4.jar

简单写好 upload.jsp 上传页面:
```

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" %>




文件上传:

```

初学Java Web(7)——文件的上传和下载

编写 UploadServlet 处理相关请求:
```java
package servlet;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

@WebServlet("/upload")
public class UploadServlet extends HttpServlet {

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 验证请求是否满足要求(post 请求 / enctype 是否以multipart打头 boolean isMultipart = ServletFileUpload.isMultipartContent(req); // 如果不满足要求就立即结束对该请求的处理 if (!isMultipart) { return; } try { // FileItem 是表单中的每一个元素的封装 // 创建一个 FileItem 的工厂类 FileItemFactory factory = new DiskFileItemFactory(); // 创建一个文件上传处理器(装饰设计模式) ServletFileUpload upload = new ServletFileUpload(factory); // 解析请求 List<FileItem> items = upload.parseRequest(req); for (FileItem fileItem : items) { // 判断空间是否是普通控件 if (fileItem.isFormField()) { // 普通控件 } else { // 上传控件 // 将上传的文件保存到服务器 fileItem.write(new File("C:/", "testImg.jpg")); } } } catch (Exception e) { e.printStackTrace(); } }

}
```

文件上传的细节

上面已经能实现简单的文件上传功能了,但文件上传有很多需要注意的地方。

缓存大小和临时目录
在上传文件的时候,如果文件过大,而且是将文件放在缓存中,就可能造成内存溢出
默认的缓存大小为 10 kb,临时目录的默认值为 tomcat/temp

解决方案:将操作缓存大小的文件放在服务器的磁盘(临时目录)中,在文件的大小超过设定的缓存大小的时候就会使用到临时目录

// 设置缓存大小 500kb factory.setSizeThreshold(1024*500); // 设置临时目录 factory.setRepository(new File("C:/"));

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwygzy.html