用javaweb实现文件上传下载
时间: 2023-12-11 11:49:49 浏览: 54
实现文件上传下载需要以下步骤:
1. 创建一个包含文件上传和下载的web应用程序。
2. 在web.xml文件中配置multipart-config元素。该元素指定允许文件上传的最大大小,以及上传文件的位置。
3. 创建一个servlet来处理文件上传,该servlet应该解析multipart/form-data请求,并将上传的文件保存到指定的位置。
4. 创建一个JSP页面,允许用户上传文件,并显示已上传的文件列表。
5. 创建一个servlet来处理文件下载,该servlet应该读取指定的文件,并将其发送回客户端。
下面是一个简单的示例,演示如何使用Java Servlet和JSP实现文件上传和下载:
1. 创建一个名为fileupload的web应用程序。
2. 在web.xml文件中添加以下内容:
```xml
<servlet>
<servlet-name>FileUploadServlet</servlet-name>
<servlet-class>com.example.FileUploadServlet</servlet-class>
<multipart-config>
<max-file-size>1048576</max-file-size>
<location>/tmp</location>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>FileUploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>FileDownloadServlet</servlet-name>
<servlet-class>com.example.FileDownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FileDownloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
```
该配置文件将FileUploadServlet映射到/upload URL,将FileDownloadServlet映射到/download URL。此外,它还指定了允许上传的文件大小和文件上传的位置。
3. 创建一个名为FileUploadServlet的servlet:
```java
package com.example;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
@WebServlet("/upload")
@MultipartConfig(
maxFileSize = 1024 * 1024 * 5, // 5MB
maxRequestSize = 1024 * 1024 * 10, // 10MB
fileSizeThreshold = 1024 * 1024 // 1MB
)
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Collection<Part> parts = request.getParts();
for (Part part : parts) {
String fileName = extractFileName(part);
part.write(getUploadPath() + File.separator + fileName);
out.println("File " + fileName + " uploaded successfully!");
}
}
private String extractFileName(Part part) {
String contentDisp = part.getHeader("content-disposition");
String[] tokens = contentDisp.split(";");
for (String token : tokens) {
if (token.trim().startsWith("filename")) {
return token.substring(token.indexOf("=") + 2, token.length() - 1);
}
}
return "";
}
private String getUploadPath() {
return getServletContext().getRealPath("") + File.separator + "uploads";
}
}
```
该servlet使用了javax.servlet.http.Part类来处理文件上传。在doPost方法中,它使用request.getParts()方法获取上传文件的Part对象集合。然后,它遍历Part对象集合,并将每个Part对象保存到指定的上传位置。
4. 创建一个名为fileupload.jsp的JSP页面:
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h1>File Upload</h1>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" /><br />
<input type="submit" value="Upload" />
</form>
<hr>
<h2>Uploaded Files</h2>
<ul>
<%
String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
File uploadDir = new File(uploadPath);
if (uploadDir.exists() && uploadDir.isDirectory()) {
for (File file : uploadDir.listFiles()) {
out.println("<li><a href='" + request.getContextPath() + "/download?file=" + file.getName() + "'>" + file.getName() + "</a></li>");
}
}
%>
</ul>
</body>
</html>
```
该JSP页面包含一个文件上传表单和一个已上传文件列表。文件上传表单使用enctype="multipart/form-data"属性,以允许上传文件。
5. 创建一个名为FileDownloadServlet的servlet:
```java
package com.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/download")
public class FileDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("file");
String filePath = getServletContext().getRealPath("") + File.separator + "uploads" + File.separator + fileName;
File file = new File(filePath);
response.setContentType(getServletContext().getMimeType(filePath));
response.setContentLength((int) file.length());
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
try (FileInputStream in = new FileInputStream(file); OutputStream out = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int length;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
}
}
}
```
该servlet读取指定的文件,并将其发送回客户端。它设置Content-Disposition响应头来指定下载文件的名称。
现在,您可以启动Web应用程序,并使用fileupload.jsp页面上传和下载文件。