在许多应用场景中,如网盘、论坛等,都需要实现文件上传与下载功能。本案例基于 Java Servlet 技术实现这一功能。
功能需求是用户能够选择本地文件上传到服务器指定目录;上传成功后,服务器返回文件的相关信息,如文件名、大小等;同时,用户可以通过链接下载已上传的文件。
实现时,首先创建一个 Java Web 项目,在web.xml中配置 Servlet。编写UploadServlet处理文件上传请求,使用 Apache Commons FileUpload 库解析 HTTP 请求中的文件数据,将文件保存到服务器指定路径,关键代码如下:
TypeScript
取消自动换行复制
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
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 {
private static final String UPLOAD_DIRECTORY = "uploads";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY + File.separator + fileName;
File file = new File(filePath);
item.write(file);
response.getWriter().println("File uploaded successfully: " + fileName);
}
}
} catch (FileUploadException | Exception e) {
response.getWriter().println("Error uploading file: " + e.getMessage());
}
} else {
response.getWriter().println("Not a valid file upload request");
}
}
}
对于文件下载,编写DownloadServlet,读取服务器上的文件并将其作为响应流发送给客户端。在前端页面使用 HTML 的<input type="file">标签实现文件选择,通过<a>标签的href属性指定下载链接。
该功能广泛应用于内容管理系统、在线文档处理等场景,方便用户与服务器进行文件交互。