ftp上傳下載文件,是遵照ftp協議上傳下載文件的,本例僅以下載文件為例。
重要的方法解釋:
1.FTP功能相關依賴路徑:org.apache.commons.net.ftp.*;
2.ftp默認端口是21,如果非默認端口連接,需指定:ftp.connect(ftphostaddr, 22);//22為端口號
3.ftp.changeWorkingDirectory(ftppath) //實現切換目錄
4.FTPFile[] fs = ftp.listFiles(); 獲取指定目錄下的文件列表
public class FtpTools {
private final static String ftphostaddr = "xxx";//服務器地址
private final static String ftppath = "xxx";//操作的服務器目錄
private final static String ftpname = "xxx";//服務器登錄名
private final static String ftppwd = "xxx";//登錄密碼
private final static String localpath = getCurentContentPath()+"uploadfiles";
private final static String fileSeparator = System.getProperty("file.separator");
private static final Logger LOGGER = Logger.getLogger(FtpTools.class);
public static void main(String[] args) {
FtpTools tools = new FtpTools();
tools.downFile("test.txt");
}
/**
* 從文件服務器上下載文件到本地
* @param filename
*/
public static void downFile(String filename) {
FTPClient ftp = initFtp();
try{
//4.指定要下載的目錄
ftp.changeWorkingDirectory(ftppath);// 轉移到FTP服務器目錄
//5.遍歷下載的目錄
FTPFile[] fs = ftp.listFiles();
for (FTPFile ff : fs) {
//解決中文亂碼問題,兩次解碼
byte[] bytes=ff.getName().getBytes("iso-8859-1");
String fn=new String(bytes,"utf8");
if (fn.equals(filename)) {
//6.寫操作,將其寫入到本地文件中
LOGGER.info("下載文件:"+filename+"開始:"+System.currentTimeMillis());
File localFile = new File(localpath +fileSeparator+ ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftp.retrieveFile(ff.getName(), is);
//7.判斷本地文件是否正確寫入,如果正確寫入,將文件服務器上的文件刪除
if(localFile.exists()){
LOGGER.info("刪除服務器上文件:"+filename);
ftp.deleteFile(ff.getName());
}
LOGGER.info("下載文件:"+filename+"結束:"+System.currentTimeMillis());
is.close();
}
}
ftp.logout();
}catch(Exception e){
e.printStackTrace();
new Exception("從服務器下載文件過程中發生錯誤");
}finally{
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
public static FTPClient initFtp() {
int reply;
FTPClient ftp = new FTPClient();
try {
// 1.連接服務器
//ftp.connect(ftphostaddr);
ftp.connect(ftphostaddr, 22);
// 2.登錄服務器 如果采用默認端口,可以使用ftp.connect(url)的方式直接連接FTP服務器
ftp.login(ftpname, ftppwd);
// 3.判斷登陸是否成功
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
new Exception("服務器連接失敗");
}
return ftp;
}
public static String getCurentContentPath(){
String path = "";
path = FtpTools.class.getClassLoader().getResource("").toString();
path = path.replace("file:", "").substring(0, path.indexOf("WEB-INF")).replace("WEB-IN", "").replace("WEB-I", "");
return path;
}
}
