FtpClient

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FtpClient相关的知识,希望对你有一定的参考价值。

用有SUN 的FtpClient.get()方法下载文件,大点的文件下载时运行这个方法后就没有响应了,而下点的文件则能非常快速的下载。谁能告诉我这是为什么吗?
anckbx
ftp连接代码没有什么问题,不然我小点文件也不会下载下来了!

没有人知道吗?

当时我用SUN 的FtpClient.get()方法下载文件是有问题的,我推荐你用org.apache.commons.net.ftp.FTPClient下载文件,可以解决中文文件下载问题,你可以去我博客里看看哦:http://hi.baidu.com/renliangli/blog/item/6ccb6b3a049d95c9d46225a5.html,文章摘给你吧:
现在就来看下我解决的代码吧,希望对遇到同样问题的人有点帮助。

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的主要内容,如果未能解决你的问题,请参考以下文章

ftp读取图片并转Base64

只取“.jpg”(Android)[重复]

FTP服务器文件上传的代码实现

Java FTP上传下载的实现

java 下载异地FTP中的zip文件

Apache Commons FTPClient未从源文件中检索所有字节[重复]