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用了这个版本比较老的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-02-25
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服务器,我可以给你份
第2个回答  2010-02-25
FtpClient 这个不好用
试试 smartupload

ftpclient创建多级目录慢
4. FTP 服务器配置限制: - 有些 FTP 服务器可能会限制目录的创建速度,这是为了防止滥用或过载服务器。如果受到服务器的限制,你可以尝试询问服务器管理员是否有相关限制,并了解是否有办法提高创建目录的速度。综上所述,FTPClient 创建多级目录慢的原因有多种可能性,包括网络问题、服务器响应时间...

ftpClient类怎么设置代理
1、首先来添加一个代理服务器,打开软件主界面,[选项]菜单下执行[参数设置]命令,或直接按F6键也可以弹出设置窗口。2、窗口左侧树型分类中找到[连接]-[代理],点击后右边显示了代理服务器列表,默认列表是空的.

如何使用知行之桥EDI系统实现FTP Client和FTP Server连接?
知行之桥EDI系统FTP Client端口的设置包括远程主机、TLS类型、端口号及客户端认证信息,以实现与服务器的连接。设置上传\/下载文件夹路径,完成FTP Client对FTP Server的数据操作。完成配置后,点击FTP Client端口的测试连接按钮,若显示连接成功,则配置正确。进行FTP连接测试,验证服务端口。上传文件至FTP Ser...

filezilla ftp client和filezilla server有什么区别??分别有什么用途...
前者是客户端,用来通过ftp或者sftp协议上传下载文件的 --- 有它,你能连别人的服务器上传和下载 后者是服务端,用来搭建ftp或者sftp服务的 ---有它,别人能连你的服务器上传下载。

FTP的主动传输和被动传输以及实现FTPClient连接池
在开发中,可使用SpringBoot框架实现FTPClient连接池。通过创建SpringBoot项目,添加FTP相关依赖,配置application.properties文件,以及编写CommandLineRunner测试类,来实现FTPClient的连接与操作。在项目中,可使用ftp-client-pool-root源码进行FTPClient的连接池实现,包含FTP客户端、连接池配置、测试类等。

FTPClient需要关闭吗
这是FTP客户端,一般在操作系统中默认开启,不需要关闭

FTPClient类的listFile()卡住了,啥原因啊
这个方法要和ftp服务器通讯,执行list命令,因此如果网络不通、服务器没登陆等都可能导致调用阻塞、出错等,你手工ftp登陆服务器试一下。

ftpClient中的rename这个改名方法是怎么调用的
ftpClient中的rename这个改名方法是怎么调用的  我来答 1个回答 #热议# 大多数男性都抵触彩礼吗?为什么? 匿名用户 2016-07-07 展开全部 rename的参数rename命令的格式:rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 第一个参数:被替换掉的字符串第二个参数:替换成的字符串第三个参数:匹配...

filezilla ftp client和filezilla server有什么区别??分别有什么用途...
前者是客户端,用来通过ftp或者sftp协议上传写在文件的 --- 有它,你能连别人的服务器上传和下载 后者是服务端,用来搭建ftp或者sftp服务的(以便为别人通过ftp客户端访问自己的文件提供服务)---有他,别人能连你的服务器上传下载

03-Java框架FTPClient 使用rename()移动文件和文件重命名
在深入研究FTPClient的API后,我们发现了一个名为rename()的方法,它出乎意料地满足了我们的需求。通过仅使用一行代码,我们就能实现文件的移动。rename()方法支持相对路径,允许我们在不完全指定完整路径的情况下进行操作。它还能在使用相对路径的同时,与绝对路径相结合,提供更大的灵活性。值得注意的是,...

相似回答