在 Java 中使用 MultipartFile 上传文件通常是在 Web 应用程序中进行的操作,特别是在处理文件上传功能时。下面我将介绍三种常见的文件上传方式,并提供相应的示例代码和依赖坐标。
这是从 Servlet 3.0 开始内置的文件上传功能。
步骤流程:
Part
对象来处理上传的文件数据。示例代码:
HTML 表单(index.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传示例</title>
</head>
<body>
<form action="fileUploadServlet" method="post" enctype="multipart/form-data">
选择文件: <input type="file" name="file">
<input type="submit" value="上传文件">
</form>
</body>
</html>
Servlet 处理文件上传(FileUploadServlet.java):
import java.io.IOException;
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 javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.Part;
@WebServlet("/fileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
for (Part part : request.getParts()) {
String fileName = getFileName(part); // 获取文件名
// 将文件保存到服务器上的某个位置
part.write("上传目录/" + fileName);
}
response.getWriter().println("文件上传成功!");
}
private String getFileName(Part part) {
String contentDisposition = part.getHeader("content-disposition");
String[] tokens = contentDisposition.split(";");
for (String token : tokens) {
if (token.trim().startsWith("filename")) {
return token.substring(token.indexOf('=') + 1).trim().replace("\"", "");
}
}
return "";
}
}
依赖坐标(不需要额外的依赖)。
Apache Commons FileUpload 库是一个常用的第三方库,用于处理文件上传。
步骤流程:
MultipartFile
。示例代码:
依赖坐标(Maven 和 Gradle):
Maven:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
Gradle:
implementation 'commons-fileupload:commons-fileupload:1.4'
Servlet 处理文件上传(FileUploadServlet.java):
import java.io.File;
import java.util.List;
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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
@WebServlet("/fileUploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory 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 = "上传目录" + File.separator + fileName;
File uploadedFile = new File(filePath);
item.write(uploadedFile);
}
}
response.getWriter().println("文件上传成功!");
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else {
response.getWriter().println("不是一个文件上传请求.");
}
}
}
如果你的项目使用了 Spring Boot,文件上传会更加方便,因为 Spring Boot 提供了 MultipartFile
来简化文件上传操作。
步骤流程:
示例代码:
依赖坐标(Maven 和 Gradle):
Maven:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.boot:spring-boot-starter-web'
Spring Boot 控制器(FileUploadController.java):
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
@RestController
public class FileUploadController {
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
String fileName = file.getOriginalFilename();
String filePath = "上传目录" + File.separator + fileName;
file.transferTo(new File(filePath));
return "文件上传成功!";
} catch (IOException e) {
e.printStackTrace();
return "文件上传失败: " + e.getMessage();
}
} else {
return "请选择要上传的文件.";
}
}
}
以上是三种常见的 Java 文件上传方式的示例,具体选择哪种方式取决于你的项目需求和技术栈。