FTP相关内容
简介java程序使用ftp
需要的jar包相关代码一些使用注意
FTP相关内容
简介
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Upload)。”下载”文件就是从远程主机拷贝文件至自己的计算机上;”上传”文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。 —— [ 百度百科 ]
java程序使用ftp
需要的jar包
<dependency>
<groupId>commons-net
</groupId>
<artifactId>commons-net
</artifactId>
<version>3.3
</version>
</dependency>
相关代码
FtpParamter.java
public class FtpParamter {
private String host;
private int port;
private String user;
private String password;
public FtpParamter() {}
}
FtpFile.java
import java.io.InputStream;
/**
* ftp文件对象
*/
public class FtpFile {
private String remoteFilePath;
private String remoteFilename;
private InputStream is;
private String localFilePath;
public FtpFile() {}
FtpUtils.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.lang.CharEncoding;
import org.apache.commons.net.ftp.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.its.itone.datatools.vo.FtpFile;
import com.its.itone.datatools.vo.FtpParamter;
public class FtpUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(FtpUtils.class);
private static FTPClient ftpclient;
public FtpUtils() {}
/**
* 登录
*
* @param fp 相关信息对象
* @return true-成功;false-失败
*/
public static boolean loginFtp(
final FtpParamter fp) {
ftpclient =
new FTPClient();
try {
ftpclient.setControlEncoding(CharEncoding.UTF_8);
ftpclient.connect(fp.getHost(), fp.getPort());
int reply = ftpclient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
LOGGER.error(
"retrieveFile,cannot connect server");
return false;
}
if (!ftpclient.login(fp.getUser(), fp.getPassword())) {
LOGGER.info(
"retrieveFile,invalid username or password");
return false;
}
ftpclient.setConnectTimeout(
60000 *
20);
}
catch (Exception e) {
LOGGER.error(
"retrieveFile,connect server excelption:" + e.getMessage());
return false;
}
return true;
}
/**
* 上传文件到ftp服务端
*
* @param fp 相关信息对象
* @param file 封装好的FtpFile对象
* @return
* @throws Exception
*/
public static boolean sendFile(
final FtpParamter fp,
final FtpFile file)
throws Exception {
if(!loginFtp(fp)) {
return false;
}
try{
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
return ftpclient.storeFile(file.getRemoteFilename(), file.getIs());
}
catch (IOException e) {
throw e;
}
finally {
try {
ftpclient.disconnect();
}
catch (IOException e) {
LOGGER.error(
"error:" + e.getMessage(), e);
}
}
}
/**
* 下载远程文件夹下指定的文件,或者该文件夹下所有文件
*
* @param fp
* @param remotePathName 远程文件 服务器地址
* @param localPathName 本地文件 客户端
* @param fileName 下载的文件名
* @return
*/
public static boolean downLoadFile(
final FtpParamter fp,
final String remotePathName,
final String localPathName,
final String fileName) {
if(!loginFtp(fp)) {
return false;
}
boolean flag =
true;
boolean changedir;
OutputStream os =
null;
try {
ftpclient.enterLocalPassiveMode();
changedir = ftpclient.changeWorkingDirectory(remotePathName);
if (!changedir) {
return false;
}
FTPFile[] files = ftpclient.listFiles();
File localPathFile =
new File(localPathName);
if (!localPathFile.exists() && !localPathFile.isDirectory()) {
localPathFile.mkdirs();
}
for (FTPFile file : files) {
if (fileName !=
null) {
if (fileName.equals(file.getName())) {
os =
new FileOutputStream(localPathName + File.separator + file.getName());
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
flag = ftpclient.retrieveFile(remotePathName + File.separator + file.getName(), os);
if (!flag) {
break;
}
}
}
else {
os =
new FileOutputStream(localPathName + File.separator + file.getName());
ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
flag = ftpclient.retrieveFile(remotePathName + File.separator + file.getName(), os);
if (!flag) {
break;
}
}
}
}
catch (Exception e1) {
flag =
false;
LOGGER.info(
"downLoadFile Exception", e1.getMessage());
}
finally {
try {
if (os !=
null) {
os.flush();
os.close();
}
}
catch (IOException e) {
LOGGER.error(
"downLoadFile,FileOutputStream close Exception:", e.getMessage());
}
closeFTP();
}
return flag;
}
/**
* ftp移动文件到指定目录
*
* @param ftpParamter ftp相关信息对象
* @param fromFilePath 移动之前文件所在路径
* @param toFilePath 移动之后文件所在路径
* @param fromFileName 要移动的文件名
* @param toFileName 移动之后的文件名
* @return Boolean
*/
public static Boolean
moveFile(
final FtpParamter ftpParamter,
final String fromFilePath,
final String toFilePath,
final String fromFileName,
final String toFileName) {
if(!loginFtp(ftpParamter)) {
return false;
}
try {
Boolean bool2 = ftpclient.makeDirectory(toFilePath);
LOGGER.info(
"创建文件夹["+ toFilePath +
"]: " + bool2);
Boolean bool = ftpclient.changeWorkingDirectory(fromFilePath);
LOGGER.info(
"改变ftp工作目录[" + fromFilePath +
"]: " + bool);
if(!bool) {
return false;
}
int RNFRReplayCode = ftpclient.sendCommand(FTPCmd.RNFR, fromFileName);
int RANTOReplayCode = ftpclient.sendCommand(FTPCmd.RNTO, toFilePath + File.separator + toFileName);
LOGGER.info(
"RNFRReplayCode: "+ RNFRReplayCode +
", RANTOReplayCode: " + RANTOReplayCode);
if (!FTPReply.isPositiveIntermediate(RNFRReplayCode) || !FTPReply.isPositiveCompletion(RANTOReplayCode)) {
return false;
}
return true;
}
catch (Exception e) {
LOGGER.error(
"移动文件到指定路径出现异常{}", e);
return false;
}
finally {
closeFTP();
}
}
/**
* ftp断开连接
*/
public static void closeFTP() {
try {
ftpclient.disconnect();
}
catch (IOException e) {
LOGGER.error(
"retrieveFile,disconnection Exception:" + e.getMessage());
}
}
}
一些使用注意
解决ftp阻塞问题
程序运行到 FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态。 解决方法:在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode(); 意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。因为ftp server可能每次开启不同的端口来传输数据,但可能在ftp服务运行时,由于安全限制,PC可能某些端口没有开启,所以就出现阻塞。
回退到ftp上一级目录
ftpclient
.changeWorkingDirectory(
"../../")
转载请注明原文地址: https://ju.6miu.com/read-1000178.html