You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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为你实际的包名)

七、测试与注意事项

  1. 确保你的FTP服务器(比如FileZilla Server)已经启动,并且admin用户拥有上传权限
  2. 测试时选择文件点击上传,查看控制台输出和前端返回结果
  3. 如果遇到中文文件名乱码,可以在FTP工具类中添加:client.setControlEncoding("UTF-8");,同时确保FTP服务器也配置了UTF-8编码
  4. 可以根据需求扩展功能,比如添加文件类型校验、上传进度显示等

内容的提问来源于stack exchange,提问作者Dinesh Chebolu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:07:42