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文件夹),我们还可以查看进度条显示上传进度,如果在上传过程中发生错误,错误信息将被显示在错误页面上。



还没有评论,来说两句吧...