1.功能: 需要实现ftp下载的一个小功能。2.问题: 能连接上ftp服务器,但不能下载,也不报错。3.试过的办法: 首先在dos下用ftp命令下载,可以下载,没有问题。
然后用相同的代码去下载其他ftp服务器的文件,也可以下载,没有问题。4.具体代码:
package ftp2;
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 使用commons的net包进行ftp链接. 相关包:commons-net-1.4.1.jar ; * commons-io-1.2.jar;jakarta-oro-2.0.8.jar测试通过.可以列出ftp上的文件 * 通过把ftp服务器上的文件流连接到outSteam及可以把文件下载到本机的目录..限制如果目录为中文则需要处理.最好使用英文文件名 * */ public class ListFtpFile { private FTPClient ftpClient = new FTPClient();
private OutputStream outSteam = null; /** * ftp服务器地址 */ private String hostName = "192.168.5.1"; private int port = 21; /** * 登录名 */ private String userName = "yy";//匿名登录,空字符串不行 /** * 登录密码 */ private String password = "yy_123456";//随便一个地址,我胡乱写一个也可以运行的 /** * 需要访问的远程目录 */ private String remoteDir ="export/home/omc/netnumen/ems/ums-server/works/topo/topo1/runtime/ppus/uca.ppu/uca-mml.pmu/mmloutputfiles/";
/** * 下载 */ private void download() { try { // 链接到ftp服务器 ftpClient.connect(hostName,port); System.out.println("连接到ftp服务器:" + hostName + " 成功..开始登录"); // 登录.用户名 密码 boolean b = ftpClient.login(userName, password); System.out.println("登录成功." + b); // 检测连接是否成功 int reply = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP server refused connection."); System.exit(1); } ftpClient.setControlEncoding("GBK"); FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);//1.这个参数传的是不是ftp服务器的系统,如果是,怀疑有问题,服务器的系统是sun的。 conf.setServerLanguageCode("zh"); FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir); if (remoteFiles != null) { for (int i = 0; i < remoteFiles.length; i++) { String name = remoteFiles[i].getName(); //下载 File localFile = new File("c:/001/ftp/" + name); OutputStream is = new FileOutputStream(localFile); //retrieveFile的第一个参数需要是 ISO-8859-1 编码,并且必须是完整路径! String fileName = remoteDir + name; ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"ISO-8859-1"), is); is.close(); //打印
long length = remoteFiles[i].getSize(); String readableLength = FileUtils.byteCountToDisplaySize(length); System.out.println(name + ":\t"+remoteFiles[i].isFile()+"\t" + readableLength); } } ftpClient.logout(); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(outSteam); try { ftpClient.disconnect(); } catch (IOException ioe) { ioe.printStackTrace(); }
} } /** * 测试 * */ public static void main(String[] args) { ListFtpFile listFtpfiles = new ListFtpFile(); listFtpfiles.download(); } }
然后用相同的代码去下载其他ftp服务器的文件,也可以下载,没有问题。4.具体代码:
package ftp2;
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.SocketException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPClientConfig; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; /** * 使用commons的net包进行ftp链接. 相关包:commons-net-1.4.1.jar ; * commons-io-1.2.jar;jakarta-oro-2.0.8.jar测试通过.可以列出ftp上的文件 * 通过把ftp服务器上的文件流连接到outSteam及可以把文件下载到本机的目录..限制如果目录为中文则需要处理.最好使用英文文件名 * */ public class ListFtpFile { private FTPClient ftpClient = new FTPClient();
private OutputStream outSteam = null; /** * ftp服务器地址 */ private String hostName = "192.168.5.1"; private int port = 21; /** * 登录名 */ private String userName = "yy";//匿名登录,空字符串不行 /** * 登录密码 */ private String password = "yy_123456";//随便一个地址,我胡乱写一个也可以运行的 /** * 需要访问的远程目录 */ private String remoteDir ="export/home/omc/netnumen/ems/ums-server/works/topo/topo1/runtime/ppus/uca.ppu/uca-mml.pmu/mmloutputfiles/";
/** * 下载 */ private void download() { try { // 链接到ftp服务器 ftpClient.connect(hostName,port); System.out.println("连接到ftp服务器:" + hostName + " 成功..开始登录"); // 登录.用户名 密码 boolean b = ftpClient.login(userName, password); System.out.println("登录成功." + b); // 检测连接是否成功 int reply = ftpClient.getReplyCode(); if(!FTPReply.isPositiveCompletion(reply)) { ftpClient.disconnect(); System.err.println("FTP server refused connection."); System.exit(1); } ftpClient.setControlEncoding("GBK"); FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);//1.这个参数传的是不是ftp服务器的系统,如果是,怀疑有问题,服务器的系统是sun的。 conf.setServerLanguageCode("zh"); FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir); if (remoteFiles != null) { for (int i = 0; i < remoteFiles.length; i++) { String name = remoteFiles[i].getName(); //下载 File localFile = new File("c:/001/ftp/" + name); OutputStream is = new FileOutputStream(localFile); //retrieveFile的第一个参数需要是 ISO-8859-1 编码,并且必须是完整路径! String fileName = remoteDir + name; ftpClient.retrieveFile(new String(fileName.getBytes("GBK"),"ISO-8859-1"), is); is.close(); //打印
long length = remoteFiles[i].getSize(); String readableLength = FileUtils.byteCountToDisplaySize(length); System.out.println(name + ":\t"+remoteFiles[i].isFile()+"\t" + readableLength); } } ftpClient.logout(); } catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(outSteam); try { ftpClient.disconnect(); } catch (IOException ioe) { ioe.printStackTrace(); }
} } /** * 测试 * */ public static void main(String[] args) { ListFtpFile listFtpfiles = new ListFtpFile(); listFtpfiles.download(); } }
不是路径的问题,同样的路径用dos下的命令就能下载
走到 FTPFile[] remoteFiles = ftpClient.listFiles(remoteDir);