java如何 上传文件
使用Servlet实现文件上传
在Java中,可以通过Servlet结合Apache Commons FileUpload库来实现文件上传功能。需要添加以下依赖到项目中:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
创建一个Servlet处理文件上传请求:
@WebServlet("/upload")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uploadPath = getServletContext().getRealPath("") + File.separator + "uploads";
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) uploadDir.mkdir();
for (Part part : request.getParts()) {
String fileName = part.getSubmittedFileName();
if (fileName != null && !fileName.isEmpty()) {
part.write(uploadPath + File.separator + fileName);
}
}
response.getWriter().println("File uploaded successfully");
}
}
使用Spring Boot实现文件上传
在Spring Boot应用中,可以通过MultipartFile接口简化文件上传:
@RestController
public class FileUploadController {
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
try {
String uploadDir = "uploads/";
Files.createDirectories(Paths.get(uploadDir));
String filePath = uploadDir + file.getOriginalFilename();
file.transferTo(new File(filePath));
return ResponseEntity.ok("File uploaded successfully: " + filePath);
} catch (IOException e) {
return ResponseEntity.status(500).body("Upload failed: " + e.getMessage());
}
}
}
确保在application.properties中配置最大文件大小:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
客户端HTML表单
创建一个简单的HTML表单用于文件上传:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<button type="submit">Upload</button>
</form>
安全注意事项
文件上传功能需要特别注意安全性问题:
- 验证文件类型,不要仅依赖文件扩展名
- 限制上传文件大小
- 对上传的文件进行病毒扫描
- 不要将上传文件保存在web可访问目录
- 为上传文件生成随机文件名,避免目录遍历攻击
处理大文件上传
对于大文件上传,可以考虑分块上传策略:

// 分块上传示例
@PostMapping("/chunk-upload")
public ResponseEntity<String> chunkUpload(
@RequestParam("chunk") MultipartFile chunk,
@RequestParam("chunkNumber") int chunkNumber,
@RequestParam("totalChunks") int totalChunks,
@RequestParam("identifier") String identifier) {
// 实现分块合并逻辑
return ResponseEntity.ok("Chunk received");
}
以上方法提供了从基础到进阶的文件上传实现方案,可根据具体需求选择合适的实现方式。






