下面就是使用JSP实现文件上传功能的攻略。
1. 前置准备
在进行文件上传的操作时,需要使用到Web容器提供的Servlet API和一些第三方的类库,所以在开始实现前,需要进行一些前置准备。
1.1. 导入第三方类库
上传文件过程中,需要用到Apache的常用文件上传组件commons-fileupload,所以需要下载并导入到项目中。在项目中创建一个名叫lib
的文件夹(如果已经存在可以跳过),然后将下载好的commons-fileupload-1.4.jar
文件复制到该文件夹下。接着,右键单击该jar包文件,选择Build Path
-> Add to Build Path
,即可将其导入到项目中。
1.2. 导入Servlet API
在使用Servlet时,需要导入Servlet的API包,如果使用的是Maven进行项目管理,则不需要额外导入,否则需要手动导入Servlet API包。
2. 实现文件上传
实现文件上传的关键就是通过multipart/form-data
类型的POST
请求提交表单,然后在Servlet中接收上传文件的InputStream
对象,将其写入到磁盘中保存。
下面是通过JSP实现文件上传的步骤:
2.1. 创建文件上传页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
在页面中我们使用了<form>
标签提交一个multipart/form-data
类型的表单,并指定了POST
请求的地址和请求方法。表单中包括一个文件选择框和一个提交按钮。
2.2. 编写Servlet类处理上传请求
@WebServlet("/upload")
@MultipartConfig // 必须添加该注解
public class UploadServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
Part part = request.getPart("file");
String fileName = part.getSubmittedFileName();
InputStream is = part.getInputStream();
byte[] buffer = new byte[1024];
int len;
String filePath = "/tmp/" + fileName;
OutputStream os = new FileOutputStream(filePath);
while ((len = is.read(buffer)) > 0) {
os.write(buffer, 0, len);
}
os.close();
is.close();
out.println("文件上传成功!");
out.println("<a href='index.jsp'>返回首页</a>");
} catch (FileNotFoundException e) {
out.println("上传文件不存在!");
} catch (IOException e) {
out.println("上传文件失败!");
}
}
}
在该Servlet中,我们首先获得请求中的文件流,然后通过Part#getSubmittedFileName()
方法获取上传的文件的原始名称,并将文件写入到磁盘中。最后通过PrintWriter
对象输出上传结果。
需要注意的是,我们在Servlet类上添加了@MultipartConfig
注解,来指定Servlet支持文件上传的类型和最大文件大小等必要的配置。
2.3. 测试
上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。
3. 使用第三方类库
commons-fileupload是Apache的一个常用文件上传库,其可以方便地解析请求中的文件,并提供文件上传的处理方法。
3.1. 添加依赖
在项目的pom.xml
文件中添加以下依赖:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
3.2. 编写Servlet类处理上传请求
@WebServlet("/upload2")
public class FileUploadServlet2 extends HttpServlet {
private static final String UPLOAD_DIRECTORY = "/tmp";
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 检查是否为文件上传请求
if (!ServletFileUpload.isMultipartContent(request)) {
out.println("请求不支持文件上传");
return;
}
// 获取上传目录路径
String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdir();
}
// 最大文件上传大小限制,单位为MB
int fileSizeThreshold = 1024 * 1024 * 10;
int maxFileSize = 1024 * 1024 * 50;
// 配置文件上传处理器
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
factory.setSizeThreshold(fileSizeThreshold);
ServletFileUpload fileUpload = new ServletFileUpload(factory);
fileUpload.setFileSizeMax(maxFileSize);
List<FileItem> formItems = null;
try {
formItems = fileUpload.parseRequest(request);
} catch (FileUploadException e) {
out.println("文件上传失败,原因是:" + e.getMessage());
return;
}
// 处理上传文件
if (formItems != null && formItems.size() > 0) {
for (FileItem item : formItems) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = uploadPath + File.separator + fileName;
File uploadFile = new File(filePath);
try {
item.write(uploadFile);
out.println("文件上传成功,保存路径为:" + filePath);
} catch (Exception e) {
out.println("文件上传失败,原因是:" + e.getMessage());
}
}
}
out.println("<a href='index.jsp'>返回首页</a>");
} else {
out.println("请选择上传文件!");
}
}
}
在该Servlet中,我们首先检查请求是否为文件上传请求,如果不是则直接返回。然后,我们通过ServletFileUpload
类解析请求中的文件,并将文件写入到指定的目录中。
需要注意的是,我们在配置ServletFileUpload
对象时,使用了Apache在文件上传方面提供的一些配置,比如FileSizeMax、Repository等等。
3.3. 创建文件上传页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload2" enctype="multipart/form-data" method="post">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
3.4. 测试
上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。
以上就是使用JSP实现文件上传功能的完整攻略,希望可以帮助到你。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP实现文件上传功能 - Python技术站