凌峰创科服务平台

Java文件如何上传到FTP服务器?

Java文件上传到FTP服务器

下面是一个完整的Java示例,展示如何使用Apache Commons Net库将文件上传到FTP服务器。

Java文件如何上传到FTP服务器?-图1
(图片来源网络,侵删)

准备工作

你需要添加Apache Commons Net库到你的项目中,如果你使用Maven,可以在pom.xml中添加以下依赖:

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.9.0</version>
</dependency>

完整代码示例

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.FileInputStream;
import java.io.IOException;
public class FtpUploader {
    /**
     * 上传文件到FTP服务器
     * @param host FTP服务器地址
     * @param port FTP服务器端口
     * @param username FTP用户名
     * @param password FTP密码
     * @param localFilePath 本地文件路径
     * @param remoteFilePath 远程文件路径
     * @return 上传成功返回true,否则返回false
     */
    public static boolean uploadFile(String host, int port, String username, String password,
                                    String localFilePath, String remoteFilePath) {
        FTPClient ftpClient = new FTPClient();
        FileInputStream fis = null;
        try {
            // 1. 连接FTP服务器
            ftpClient.connect(host, port);
            int reply = ftpClient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                System.out.println("FTP服务器连接拒绝");
                return false;
            }
            // 2. 登录FTP服务器
            if (!ftpClient.login(username, password)) {
                System.out.println("FTP登录失败");
                return false;
            }
            // 3. 设置文件传输模式为二进制(防止文件损坏)
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
            // 4. 进入远程目录
            String remoteDir = remoteFilePath.substring(0, remoteFilePath.lastIndexOf('/'));
            if (!remoteDir.isEmpty() && !ftpClient.changeWorkingDirectory(remoteDir)) {
                System.out.println("无法切换到远程目录: " + remoteDir);
                return false;
            }
            // 5. 获取本地文件输入流
            fis = new FileInputStream(localFilePath);
            // 6. 上传文件
            String remoteFileName = remoteFilePath.substring(remoteFilePath.lastIndexOf('/') + 1);
            if (!ftpClient.storeFile(remoteFileName, fis)) {
                System.out.println("文件上传失败");
                return false;
            }
            System.out.println("文件上传成功");
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } finally {
            // 7. 关闭资源
            try {
                if (ftpClient.isConnected()) {
                    ftpClient.logout();
                    ftpClient.disconnect();
                }
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public static void main(String[] args) {
        // FTP服务器配置
        String host = "ftp.example.com";
        int port = 21;
        String username = "your_username";
        String password = "your_password";
        // 本地文件路径
        String localFilePath = "C:/path/to/your/local/file.txt";
        // 远程文件路径(包括目录和文件名)
        String remoteFilePath = "/remote/directory/file.txt";
        // 执行上传
        boolean success = uploadFile(host, port, username, password, localFilePath, remoteFilePath);
        if (success) {
            System.out.println("文件上传成功");
        } else {
            System.out.println("文件上传失败");
        }
    }
}

代码说明

  1. 连接FTP服务器:使用FTPClient.connect()方法连接到FTP服务器,并检查连接是否成功。

  2. 登录FTP服务器:使用login()方法登录FTP服务器。

  3. 设置传输模式:使用setFileType(FTP.BINARY_FILE_TYPE)设置二进制传输模式,防止文件传输过程中损坏。

    Java文件如何上传到FTP服务器?-图2
    (图片来源网络,侵删)
  4. 切换远程目录:使用changeWorkingDirectory()方法切换到目标目录。

  5. 上传文件:使用storeFile()方法上传文件,需要提供文件名和输入流。

  6. 资源释放:在finally块中确保关闭FTP连接和文件输入流。

高级功能扩展

使用被动模式

// 在登录后添加
ftpClient.enterLocalPassiveMode();

显示上传进度

// 自定义FTPClient子类
public class ProgressFTPClient extends FTPClient {
    private ProgressListener progressListener;
    public void setProgressListener(ProgressListener progressListener) {
        this.progressListener = progressListener;
    }
    @Override
    public OutputStream storeFileStream(String remote) throws IOException {
        return new ProgressOutputStream(super.storeFileStream(remote), 
            progressListener, new File(remote).length());
    }
    // 其他方法类似...
}
// 使用示例
ProgressFTPClient ftpClient = new ProgressFTPClient();
ftpClient.setProgressListener(new ProgressListener() {
    @Override
    public void onProgress(long progress, long total) {
        System.out.println("上传进度: " + progress + "/" + total);
    }
});

处理中文文件名

// 在登录后添加
ftpClient.setControlEncoding("UTF-8");

注意事项

  1. 确保FTP服务器允许上传操作
  2. 检查目标目录是否有写入权限
  3. 处理网络超时问题
  4. 对于大文件上传,考虑使用断点续传功能
  5. 在生产环境中,建议使用SFTP代替FTP,因为FTP是不安全的协议

希望这个示例对你有帮助!如果需要更复杂的功能或有其他问题,请随时提问。

Java文件如何上传到FTP服务器?-图3
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇