/*
以sun开头的class不是java里面的标准类,而是sun公司自己的的class,因此,他们位于rt.jar当中。因此,jdk源代码中没有提供源文件。但是,可以用诸如jad之类的反编译工具进行反编译。
实际上,基本原理就是利用Socket和ServerSocket来发送遵守FTP协议的消息,与FTP服务器进行交互。
主要用到这么几个类:
sun.net.ftp.FtpClient extends sun.net.TransferProtocolClient
sun.net.TransferProtocolClient extends sun.net.NetworkClient
sun.net.TelnetInputStream extends FilterInputStream
sun.net.TelnetOutputStream extends BufferedOutputStream
因为是使用被动模式,因此,客户端要去连接服务端,
在FtpClient的源代码的openDataConnection(String s)方法中有这么一句:
serversocket = new ServerSocket(0, 1);也就是客户端随便选择一个空闲端口。
也就是说,sun的FtpClient不支持主动模式。
*/
public class FtpUtils {
/**
* 向FTP服务器上传文件
*
* @param ip
* FTP服务器ip e.g:192.168.8.22
* @param port
* FTP服务器端口
* @param username
* FTP登录账号
* @param password
* FTP登录密码
* @param serverpath
* FTP服务器保存目录(相对路径) 默认缺省时指向主目录
* @param file
* 上传到FTP服务器上的文件的绝对路径 e.g: E:/log/log.txt OR E:/log/log.txt
*
* @return
* 成功返回true,否则返回false
*/
public boolean uploadFile(String ip, int port, String username,
String password, String serverpath, String file) {
// 初始表示上传失败
boolean success = false;
// 创建FTPClient对象
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("UTF-8");
try {
int reply=0;
// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(ip)的方式直接连接FTP服务器
ftp.connect(ip, port);
// 登录ftp
ftp.login(username, password);
// 看返回的值是不是reply>=200&&reply<300 如果是,表示登陆成功
reply = ftp.getReplyCode();
// 以2开头的返回值就会为真
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
// 转到指定上传目录
serverpath=gbkToIso8859(serverpath);
ftp.changeWorkingDirectory(iso8859ToGbk(serverpath));
checkPathExist(ftp,iso8859ToGbk(serverpath));
//输入流
InputStream input=null;
try {
file=gbkToIso8859(file);
input = new FileInputStream(iso8859ToGbk(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 将上传文件存储到指定目录
file=iso8859ToGbk(file);
flag=ftp.storeFile(iso8859ToGbk(serverpath)+"/"+iso8859ToGbk(getFilename(file)), input);
// 关闭输入流
input.close();
// 退出ftp
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
/**
* 从FTP服务器下载文件
*
* @param ip
* FTP服务器ip e.g:192.168.8.22
* @param port
* FTP服务器端口
* @param username
* FTP登录账号
* @param password
* FTP登录密码
* @param serverpath
* FTP服务器上的相对路径 默认缺省时指向主目录
* @param fileName
* 要下载的文件名
* @param localPath
* 下载后保存到本地的路径 不含文件名
* @return
* 成功返回true,否则返回false
*/
public boolean downFile(String ip, int port, String username,
String password, String serverpath, String fileName,
String localPath) {
// 初始表示下载失败
boolean success = false;
// 创建FTPClient对象
FTPClient ftp = new FTPClient();
ftp.setControlEncoding("UTF-8");
try {
int reply;
// 连接FTP服务器
// 如果采用默认端口,可以使用ftp.connect(ip)的方式直接连接FTP服务器
ftp.connect(ip, port);
// 登录ftp
ftp.login(username, password);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return success;
}
// 转到指定下载目录
serverpath=gbkToIso8859(serverpath);
ftp.changeWorkingDirectory(this.iso8859ToGbk(serverpath));
// 列出该目录下所有文件
FTPFile[] fs = ftp.listFiles();
fileName=this.gbkToIso8859(fileName);
localPath=this.gbkToIso8859(localPath);
// 遍历所有文件,找到指定的文件
for (FTPFile f : fs) {
if (f.getName().equals(iso8859ToGbk(fileName))) {
// 根据绝对路径初始化文件
File localFile = new File(iso8859ToGbk(localPath) + "/" + f.getName());
File localFileDir = new File(iso8859ToGbk(localPath));
//保存路径不存在时创建
if(!localFileDir.exists()){
localFileDir.mkdirs();
}
// 输出流
OutputStream is = new FileOutputStream(localFile);
// 下载文件
flag=ftp.retrieveFile(f.getName(), is);
is.close();
}
}
// 退出ftp
ftp.logout();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
/**
*
* 查找指定目录是否存在 不存在创建目录
*
* @param FTPClient
* ftpClient 要检查的FTP服务器
* @param String
* filePath 要查找的目录
* @return
* boolean:存在:true,不存在:false
* @throws IOException
*/
private boolean checkPathExist(FTPClient ftpClient, String filePath)
throws IOException {
boolean existFlag = false;
try {
if (filePath != null && !filePath.equals("")) {
if (filePath.indexOf("/") != -1) {
int index = 0;
while ((index = filePath.indexOf("/")) != -1) {
if (!ftpClient.changeWorkingDirectory(filePath.substring(0,index))) {
ftpClient.makeDirectory(filePath.substring(0,index));
}
ftpClient.changeWorkingDirectory(filePath.substring(0,index));
filePath = filePath.substring(index + 1, filePath.length());
}
if (!filePath.equals("")) {
if (!ftpClient.changeWorkingDirectory(filePath)) {
ftpClient.makeDirectory(filePath);
}
}
}
existFlag = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return existFlag;
}
/**
* 根据绝对路径获得文件名
* @param file
* 文件绝对路径 e.g: e.g: E:/log/log.txt OR E://log//log.txt
* @return
* 转码后的文件名
*/
private String getFilename(String file){
//文件名
String filename="";
if(file!=null&&!file.equals("")){
file=file.replaceAll(Matcher.quoteReplacement("//"), "/");
String[] strs=file.split("/");
filename=strs[strs.length-1];
}
filename=gbkToIso8859(filename);//转码
return filename;
}
/**
* 转码[ISO-8859-1 -> GBK]
* 不同的平台需要不同的转码
* @param obj
* @return
*/
private String iso8859ToGbk(Object obj) {
try {
if (obj == null)
return "";
else
return new String(obj.toString().getBytes("iso-8859-1"), "GBK");
} catch (Exception e) {
return "";
}
}
/**
* 转码[GBK -> ISO-8859-1]
* 不同的平台需要不同的转码
* @param obj
* @return
*/
private String gbkToIso8859(Object obj) {
try {
if (obj == null)
return "";
else
return new String(obj.toString().getBytes("GBK"), "iso-8859-1");
} catch (Exception e) {
return "";
}
}
代码说明:
向FTP服务器上传文件时调用uploadFile()方法,从FTP服务器下载文件时调用downFile()方法。
当然,想向FTP服务器上传文件,FTP服务器需要开写入权限。
需要用的jar是commons-net-2.0.jar。
相关推荐
实现一个FTP协议的客户端和服务器,完成基本的文件传输功能。 功能: (1) 多客户端访问。 (2) 在获取文件之前能够先得到文件列表。 (3)实现FTP文件的上传与下载. (4) GUI(界面实现)。
用Java自己的写FTP服务器与客户端。 Control和Data双线程,数据传输时开20口,21口进行侦听与Control连接 支持USER, PASS, RETR, STOR, ABOR, QUIT 5个口令。用户验证没加入,需要的自行加入。
实现FTP客户端的基本功能,带有图形用户界面。 直接双击即可。
C语言实现FTP客户端功能,支持继点续传。同时也实现服务端功能。用户可以通过第三方客户端验证。服务端运行环境为linux.
1)用户界面模块负责响应用户的键盘鼠标输入设置服务器的各个参数,显示服务器的工作状态以及错误提示,为用户提供... 4)客户数据传输模块负责具体的与客户端的数据传输,包括文件的上传,下载,传输文件目录列表等。
JAVA FTP 文件传输 服务端 客户端JAVA FTP 文件传输 服务端 客户端JAVA FTP 文件传输 服务端 客户端
两部手机其中一部手机作为服务器,另一部手机作为客户端下载,使用FTP方式传输文件,图片下载,多图加载,滑动停止加载完整DEMO。
文件传输模块实现主机与服务器连接成功后上传和下载文件功能。辅助管理模块实现一些相关功能如:读写配置INI文件。该FTP客户端软件达到了使用方便的目标,希望开发软件的经验能为使用.NET设计开发Windows应用程序FTP...
MFC实现FTP客户端,可以连接FTP服务器进行文件传输。。。。
用python实现FTP文件传输,包括服务器端和客户端,要求 (1)客户端访问服务器端要有一个验证功能 (2)可以有多个客户端访问服务器端 (3)可以对重名文件重新上传或下载 FTP(File Transfer Protocol,文件传输...
文件传输模块实现主机与服务器连接成功后上传和下载文件功能。辅助管理模块实现一些相关功能如:读写配置INI文件。该FTP客户端软件达到了使用方便的目标,希望开发软件的经验能为使用.NET设计开发Windows应用程序FTP...
VS2005下用C#编写的FTP代码实现,包含了服务器端和客户端两个程序,实现文件的传输。
设计一个ftp客户端,能与ftp服务器实现数据交换,了解ftp行命令。 ftp客户端基本功能:下载远程文件(或文件夹),上传本地文件(或文件夹),删除本地或远程文件(或文件夹)
这是上学期编写的较为完整的网络实验程序。
用c语言编写的,Winsock实现FTP客户端,实现断点上传和下载,支持pasv和port模式,列出服务器目录内容,改变服务器目录,添加删除目录,删除文件,断开连接。 平台:win7 开发工具:VS2008
在Linux系统上使用Socket接口实现FTP客户端和服务器的程序,使客户端可以连接至服务器,并且可以进行一些FTP的基本操作。客户端和服务器的命令通道和数据通道需要分离,支持以下一些FTP命令: get:取远方的一个文件...
这个实例主要完成文件的加密异步传输。用listview显示文件 ,文件图标是用aip获取系统的.
网络环境中的一项基本应用就是将文件从一台计算机...2) 该FTP客户端程序具有以下基本功能:能完成FTP链接的打开和关闭操作;能执行文件的上传和下载;能完成目录的创建、删除等有关操作。要求可以传输简单的文本文件。
linux下c语言编写的ftp客户端和服务器端,实现了一些简单的ftp功能如上传,下载,ls等命令。