Java实现文件上传功能
在Web开发中,文件上传是一个常见的需求,无论是用户头像、个人资料的修改,还是各种业务系统中需要上传附件的场景,都离不开文件上传功能,本文将介绍如何使用Java实现文件上传功能。
1、引入依赖
在项目中,我们需要使用到Apache Commons FileUpload库来实现文件上传功能,在项目的pom.xml文件中添加以下依赖:
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
2、编写HTML表单
在前端页面中,我们需要创建一个表单来让用户选择要上传的文件,以下是一个简单的HTML表单示例:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传</title> </head> <body> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">上传</button> </form> </body> </html>
3、编写后端代码
在后端,我们需要处理用户提交的文件,以下是一个简单的Java代码示例:
import org.apache.commons.fileupload.FileItem; 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 FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 检查是否为多媒体上传 if (!ServletFileUpload.isMultipartContent(request)) { throw new ServletException("Content type is not multipart/form-data"); } // 配置上传参数 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding("UTF-8"); // 设置编码格式 upload.setSizeMax(10 * 1024 * 1024); // 设置最大上传文件大小(10MB) upload.setProgressListener(new MyProgressListener()); // 设置进度监听器,用于显示上传进度条 try { // 解析请求的内容提取文件数据(表单字段名和文件名是同一个) List<FileItem> formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { // 迭代表单数据,获取文件数据并保存到服务器指定目录(此处为项目根目录下的upload文件夹) for (FileItem item : formItems) { if (!item.isFormField()) { // 判断是否为文件数据(非表单字段) String fileName = new File(item.getName()).getName(); // 获取文件名(包含路径) String filePath = getServletContext().getRealPath("/upload"); // 获取服务器上的真实路径(项目根目录下的upload文件夹) String savePath = filePath + File.separator + fileName; // 拼接保存路径(完整文件路径) File storeFile = new File(savePath); // 创建文件对象(保存到服务器上的文件) item.write(storeFile); // 保存文件到服务器上(保存到指定路径) } else { // 如果为表单字段,则直接输出到控制台(用户名、密码等) System.out.println(item.getFieldName() + ":" + item.getString("utf-8")); // 输出表单字段名和值(中文乱码问题已解决) } } } else { // 如果表单数据为空,则返回错误信息给客户端(未选择文件) request.setAttribute("message", "请选择要上传的文件!"); // 设置错误信息属性(键为message) request.getRequestDispatcher("/error.jsp").forward(request, response); // 转发到错误页面(error.jsp)显示错误信息(message属性的值) } } catch (Exception e) { // 如果发生异常,则返回错误信息给客户端(文件上传失败) request.setAttribute("message", "文件上传失败:" + e.getMessage()); // 设置错误信息属性(键为message) request.getRequestDispatcher("/error.jsp").forward(request, response); // 转发到错误页面(error.jsp)显示错误信息(message属性的值) } finally { // 关闭资源(避免内存泄漏) upload.cleanFiles(); // 清理临时文件(存储在内存中的文件列表) } } }
4、测试文件上传功能
现在,我们可以运行项目并访问文件上传页面,选择一个文件并点击上传按钮,如果一切正常,文件将被保存到服务器的指定目录(本例中为项目根目录下的upload文件夹),我们还可以查看进度条显示上传进度,如果在上传过程中发生错误,错误信息将被显示在错误页面上。
还没有评论,来说两句吧...