如何通过Java及JSP从用户界面上传文件至FTP服务器?
如何用Java Servlet实现用户界面选择文件上传至FTP服务器
没问题!我来帮你把固定本地路径的FTP上传逻辑,改成支持用户从前端界面选择文件上传的Servlet实现。下面是完整的改造方案,包含核心代码、配置说明和注意事项:
一、核心改造思路
你原来的代码是在main方法里读取本地固定路径的文件上传到FTP,现在需要调整为:
- 前端通过表单让用户选择文件(你写的JSP表单已经满足基本需求)
- 后端用Servlet接收上传的文件流,再将这个流传递给FTP客户端完成上传
- 需要处理
multipart/form-data类型的请求,这里我们用Apache Commons FileUpload工具来简化处理(兼容性更好,也可以用Servlet 3.0+的内置API)
二、准备依赖
如果用Maven,在pom.xml中添加以下依赖:
<dependencies> <!-- Apache Commons FileUpload 处理文件上传 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.5</version> </dependency> <!-- Apache Commons IO 辅助IO操作 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.15.1</version> </dependency> <!-- FTP客户端工具 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.9.0</version> </dependency> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies>
如果不用Maven,直接下载对应的jar包放到项目的WEB-INF/lib目录下即可。
三、封装FTP上传工具类
把你原来的FTP上传逻辑封装成工具类,方便Servlet调用:
import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPConnectionClosedException; import java.io.IOException; import java.io.InputStream; public class FTPUploadUtil { public static boolean uploadFileToFTP(String server, String username, String password, String fileName, InputStream inputStream) throws IOException { FTPClient client = new FTPClient(); boolean uploadSuccess = false; try { client.connect(server); boolean loginSuccess = client.login(username, password); if (!loginSuccess) { System.out.println("FTP登录失败!"); return false; } System.out.println("成功登录FTP服务器!"); // 设置文件类型为二进制,避免文本文件乱码 client.setFileType(FTPClient.BINARY_FILE_TYPE); // 上传文件 uploadSuccess = client.storeFile(fileName, inputStream); if (uploadSuccess) { System.out.println("文件上传成功!"); } else { System.out.println("文件上传失败!"); } client.logout(); } catch (FTPConnectionClosedException e) { e.printStackTrace(); } finally { try { if (client.isConnected()) { client.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return uploadSuccess; } }
四、编写UploadServlet
这个Servlet负责接收前端上传的文件,调用FTP工具类完成上传:
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.IOException; import java.io.InputStream; import java.util.List; @WebServlet("/UploadServlet") public class UploadServlet extends HttpServlet { // FTP服务器配置 private static final String FTP_SERVER = "localhost"; private static final String FTP_USERNAME = "admin"; private static final String FTP_PASSWORD = "password"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); // 检查请求是否为multipart类型 if (!ServletFileUpload.isMultipartContent(request)) { response.getWriter().println("请选择要上传的文件!"); return; } // 配置文件上传工厂 DiskFileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); // 设置最大上传文件大小(可选,这里限制为10MB) upload.setFileSizeMax(10 * 1024 * 1024); try { // 解析请求中的文件项 List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { // 只处理文件字段,跳过普通表单字段 if (!item.isFormField()) { String fileName = item.getName(); if (fileName == null || fileName.isEmpty()) { continue; } // 获取文件输入流 InputStream inputStream = item.getInputStream(); // 调用FTP工具类上传文件 boolean success = FTPUploadUtil.uploadFileToFTP(FTP_SERVER, FTP_USERNAME, FTP_PASSWORD, fileName, inputStream); // 给前端返回上传结果 if (success) { response.getWriter().println("文件 <b>" + fileName + "</b> 上传成功!"); } else { response.getWriter().println("文件 <b>" + fileName + "</b> 上传失败,请检查FTP配置!"); } // 关闭输入流并清理临时文件 inputStream.close(); item.delete(); } } } catch (Exception e) { e.printStackTrace(); response.getWriter().println("文件上传发生错误:" + e.getMessage()); } } }
五、优化JSP页面(解决编码问题)
你原来的JSP页面基本没问题,建议把编码改成UTF-8避免中文文件名乱码:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>文件上传至FTP</title> </head> <body> <h3>选择文件上传至FTP服务器:</h3> <form action="UploadServlet" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /><br /> <input type="submit" value="上传文件" /> </form> </body> </html>
六、Servlet配置(可选)
如果你的Servlet版本低于3.0,需要在web.xml中添加Servlet映射(用@WebServlet注解的话可以跳过这一步):
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.yourpackage.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/UploadServlet</url-pattern> </servlet-mapping> </web-app>
(注意替换com.yourpackage为你实际的包名)
七、测试与注意事项
- 确保你的FTP服务器(比如FileZilla Server)已经启动,并且
admin用户拥有上传权限 - 测试时选择文件点击上传,查看控制台输出和前端返回结果
- 如果遇到中文文件名乱码,可以在FTP工具类中添加:
client.setControlEncoding("UTF-8");,同时确保FTP服务器也配置了UTF-8编码 - 可以根据需求扩展功能,比如添加文件类型校验、上传进度显示等
内容的提问来源于stack exchange,提问作者Dinesh Chebolu
相关产品推荐
相关产品推荐

