现在我会为您提供一个详细的java实现文件上传功能的攻略。包括需要用到的技术和代码示例。
技术所需
1. HTML表单
文件上传需要 HTML 表单,因为文件上传是通过 HTTP POST 请求提交的。
表单应该具有:enctype="multipart/form-data"
属性。
2. Servlet API
Servlet API提供了上传文件的功能,并解决了以下问题:
-
处理多部件(multi-part)请求。
-
提供对文件上传的接口和 api 。
-
读取表单字段的值。
3. Apache Commons File Upload
Apache Commons File Upload 是一个流行的文件上传 api,这是一个开源项目,可以轻松处理文件上传。
完整的流程
-
创建:实现 JSP/Servlet 页面,用于读取文件。页面应该为空,只有一个文件上传按钮,等待用户上传文件。
-
HTML表单:创建
.jsp
文件,这将包含 HTML 表单。
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Servlet File Upload</title>
</head>
<body style="text-align:center;">
<h2>选择文件并上传</h2>
<form method="post" action="UploadServlet" enctype="multipart/form-data">
<p>
<input type="file" name="file" />
<br/><br/>
<input type="submit" value="上传"/>
</p>
</form>
</body>
</html>
- 上传服务端程序:实现一个 servlet 用于上传从用户获取的文件并将其保存在服务器端。
@WebServlet("/UploadServlet")
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取文件
Part filePart = request.getPart("file");
String fileName = filePart.getSubmittedFileName();
InputStream fileContent = filePart.getInputStream();
//存储文件
String appPath = request.getServletContext().getRealPath("");
String fullPath = appPath + File.separator + "upload" + File.separator + fileName;
FileOutputStream out = new FileOutputStream(new File(fullPath));
IOUtils.copy(fileContent, out);
//文件上传完成后转发
request.setAttribute("message", "上传成功");
getServletContext().getRequestDispatcher("/uploadResult.jsp").forward(request, response);
}
}
- 存储文件:从表单获得的文件将被存储在本地文件系统中。在文件被存储后,上传服务户端程序将转发到上传结果页面:
//存储文件
String appPath = request.getServletContext().getRealPath("");
String fullPath = appPath + File.separator + "upload" + File.separator + fileName;
FileOutputStream out = new FileOutputStream(new File(fullPath));
IOUtils.copy(fileContent, out);
//文件上传完成后转发
request.setAttribute("message", "上传成功");
getServletContext().getRequestDispatcher("/uploadResult.jsp").forward(request, response);
- 上传结果:在上传完成时,可以使用JSP页面来显示上传结果。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传结果</title>
</head>
<body style="text-align: center;">
<h2>${message}</h2>
<a href="<%=request.getContextPath()%>/index.jsp">返回</a>
</body>
</html>
至此,java实现文件上传功能就完成了。
以下是一个使用Apache Commons FileUpload的文件上传示例:
String appPath = request.getServletContext().getRealPath("");
String savePath = appPath + File.separator + UPLOAD_DIR;
// 创建文件上传工厂实例
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存临界值,超过后将产生临时文件并存储于临时目录中
factory.setSizeThreshold(MAX_MEMORY_SIZE);
// 设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
// 创建一个新的文件上传处理程序
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
// 可以上传的文件格式
upload.setFileItemFactory(new FileItemFactory() {
@Override
public FileItem createItem(String fieldName, String contentType, boolean isFormField, String fileName) {
String[] supportedMimeTypes = {"image/jpeg", "image/png", "image/gif"};
for (String supportedMimeType : supportedMimeTypes) {
if (contentType.equals(supportedMimeType)) {
return new DiskFileItem(fieldName, contentType, isFormField, fileName);
}
}
return null;
}
});
// 使用文件上传工具解析请求并提取文件
List<FileItem> formItems = upload.parseRequest(request);
if (formItems != null && formItems.size() > 0) {
// 迭代表单数据
for (FileItem item : formItems) {
// 处理不在表单中的字段
if (!item.isFormField()) {
String fileName = new File(item.getName()).getName();
String filePath = savePath + File.separator + fileName;
File storeFile = new File(filePath);
// 在控制台输出文件的上传路径
System.out.println(filePath);
// 保存文件到硬盘
item.write(storeFile);
request.setAttribute("message", "文件上传成功!");
}
}
}
以上就是Java实现文件上传的详细攻略,希望对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现文件上传功能 - Python技术站