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

(图片来源网络,侵删)
准备工作
你需要添加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("文件上传失败");
}
}
}
代码说明
-
连接FTP服务器:使用
FTPClient.connect()方法连接到FTP服务器,并检查连接是否成功。 -
登录FTP服务器:使用
login()方法登录FTP服务器。 -
设置传输模式:使用
setFileType(FTP.BINARY_FILE_TYPE)设置二进制传输模式,防止文件传输过程中损坏。
(图片来源网络,侵删) -
切换远程目录:使用
changeWorkingDirectory()方法切换到目标目录。 -
上传文件:使用
storeFile()方法上传文件,需要提供文件名和输入流。 -
资源释放:在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");
注意事项
- 确保FTP服务器允许上传操作
- 检查目标目录是否有写入权限
- 处理网络超时问题
- 对于大文件上传,考虑使用断点续传功能
- 在生产环境中,建议使用SFTP代替FTP,因为FTP是不安全的协议
希望这个示例对你有帮助!如果需要更复杂的功能或有其他问题,请随时提问。

(图片来源网络,侵删)
