FtpClient
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FtpClient相关的知识,希望对你有一定的参考价值。
用有SUN 的FtpClient.get()方法下载文件,大点的文件下载时运行这个方法后就没有响应了,而下点的文件则能非常快速的下载。谁能告诉我这是为什么吗?
anckbx
ftp连接代码没有什么问题,不然我小点文件也不会下载下来了!
没有人知道吗?
现在就来看下我解决的代码吧,希望对遇到同样问题的人有点帮助。
1)把ftp地址中的文件保存到本地的java类源码:
package test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
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;
public class Ftp
/**
* Description: 从FTP服务器下载文件
* @param ip FTP服务器的ip地址
* @param port FTP服务器端口,默认为:21
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downFile(String ip, int port,String username, String password, String remotePath,String fileName,String localPath)
boolean success = false;
FTPClient ftp = new FTPClient();
try
int reply;
ftp.connect(ip, port);
//下面三行代码必须要,而且不能改变编码格式,否则不能正确下载中文文件
ftp.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
ftp.disconnect();
return success;
ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for(int i = 0; i < fs.length; i++)
FTPFile ff = fs[i];
if(ff.getName().equals(fileName))
File localFile = new File(localPath+File.separator+ff.getName());
//
OutputStream is = new FileOutputStream(localFile);
//注意此处retrieveFile的第一个参数由GBK转为ISO-8859-1编码。否则下载后的文件内容为空。
//原因可能是由于aix系统默认的编码为ISO-8859-1
ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), is);
is.close();
ftp.logout();
success = true;
catch (IOException e)
e.printStackTrace();
finally
if (ftp.isConnected())
try
ftp.disconnect();
catch (IOException ioe)
return success;
public static void main(String[] args)
// TODO Auto-generated method stub
Ftp.downFile("10.32.166.144", 21, "test", "test", "/flashfxp", "激活码.txt", "C:");
2)将ftp资源以文件流的方式打开,由用户决定保存在本地何处,程序运行后可以从IE跳出框中打开或者保存的Action代码,利用Struts1写的:
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package com.mocha.test;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DownloadAction extends Action
/** *//**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
* @throws IOException
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws IOException
OutputStream os=null;
try
os = response.getOutputStream();
response.reset();
downFile("10.32.166.144", 21, "test", "test", "/flashfxp", "激活码.txt",os,response);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
finally
try
os.close();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
return null;
/**
* Description: 从FTP服务器下载文件
* @param ip FTP服务器ip地址
* @param port FTP服务器端口,默认为21
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath 附件在FTP服务器上的绝对路径
* @param fileName 要下载的文件名
* @param outputStream 输出流
* @param response
* @return
*/
public static boolean downFile(String ip, int port,String username, String password, String remotePath
,String fileName,OutputStream outputStream,HttpServletResponse response)
boolean success = false;
FTPClient ftp = new FTPClient();
try
int reply;
ftp.connect(ip, port);
//下面三行代码必须要,而且不能改变编码格式
ftp.setControlEncoding("GBK");
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
conf.setServerLanguageCode("zh");
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftp.login(username, password);//登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply))
ftp.disconnect();
return success;
ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
for(int i = 0; i < fs.length; i++)
FTPFile ff = fs[i];
if(ff.getName().equals(fileName))
String filename = fileName;
//这个就就是弹出下载对话框的关键代码
response.setHeader("Content-disposition",
"attachment;filename=" +
URLEncoder.encode(filename, "utf-8"));
//将文件保存到输出流outputStream中
ftp.retrieveFile(new String(ff.getName().getBytes("GBK"),"ISO-8859-1"), outputStream);
outputStream.flush();
outputStream.close();
ftp.logout();
success = true;
catch (IOException e)
e.printStackTrace();
finally
if (ftp.isConnected())
try
ftp.disconnect();
catch (IOException ioe)
return success;
差点忘了利用ftpclient要用到的jar包了,呵呵,就这两个了:commons-net-1.4.1.jar、jakarta-oro-2.0.8.jar
对了我用的jdk是1.4的。所以commons-net-1.4.1.jar用了这个版本比较老的。 参考技术A import java.io.FileInputStream;
import java.io.IOException;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
public class FTP
String localfilename;
String remotefilename;
FtpClient ftpClient;
// server:服务器名字
// user:用户名
// password:密码
// path:服务器上的路径
public void connectServer(String ip, int port, String user,
String password, String path)
try
ftpClient = new FtpClient();
ftpClient.openServer(ip, port);
ftpClient.login(user, password);
System.out.println("login success!");
if (path.length() != 0)
ftpClient.cd(path);
ftpClient.binary();
catch (IOException ex)
System.out.println("not login");
System.out.println(ex);
public void closeConnect()
try
ftpClient.closeServer();
System.out.println("disconnect success");
catch (IOException ex)
System.out.println("not disconnect");
System.out.println(ex);
public void upload()
this.localfilename = "E:\\log\\1.1";
this.remotefilename = "1.1";
try
TelnetOutputStream os = ftpClient.put(this.remotefilename);
java.io.File file_in = new java.io.File(this.localfilename);
FileInputStream is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1)
os.write(bytes, 0, c);
System.out.println("upload success");
is.close();
os.close();
catch (IOException ex)
System.out.println("not upload");
System.out.println(ex);
public static void main(String agrs[])
FTP fu = new FTP();
fu.connectServer("127.0.0.1", 21, "admin", "admin", "/");
fu.upload();
fu.closeConnect();
这个是FTP连接代码,如果没有FTP服务器,我可以给你份 参考技术B FtpClient 这个不好用
试试 smartupload
FtpClient.storeFile返回false解决方法
参考:http://www.cnblogs.com/xiangpiaopiao2011/archive/2012/02/28/2371679.html
返回错误:ftp connect time out.
先判断是否登录成功,若登录成功之后FtpClient.storeFile还返回false,则参考下面代码
ftpClient.enterLocalPassiveMode();
ftpClient.setControlEncoding("UTF-8");
boolean stored = ftpClient.storeFile(new String(fileName.getBytes("UTF-8"),"iso-8859-1"), inputStream);
以上是关于FtpClient的主要内容,如果未能解决你的问题,请参考以下文章