Java实现FTP上传下载

polly222 贡献于2012-07-06

作者 unknow  创建于2012-06-15 14:32:00   修改者Windows 用户  修改于2012-07-03 11:04:00字数7535

文档摘要:根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。在MyEcilpse中,用Java实现FTP上传下载。
关键词:

 长沙理工大学城南学院 《JAVA程序设计》课程论文 Java实现FTP上传下载 姓名:蒋浩钧 学号:200986250333 报告说明 一、文件清单 (1)Java、FTP的介绍、基本原理。 (2)实验的设计与实现过程。 (3)程序源代码。 二、使用说明 本实验中所涉及的所有程序均在Windows 7环境下,在MyEcilpse中,用Java实现FTP上传下载,运行时直接单击程序即可运行程序。所有程序均为控制台程序,具体可根据其提示进行操作。 三、其他说明 代码不够精确,截图不够清楚。 文章摘要:根据FTP 的工作原理,在主函数中建立一个服务器套接字端口,等待客户端请求,一旦客户端请求被接受,服务器程序就建立一个服务器分线程,处理客户端的命令。如果客户端需要和服务器端进行文件的传输,则建立一个新的套接字连接来完成文件的操作。在MyEcilpse中,用Java实现FTP上传下载。 1、Java Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。    Java类 ◆final类:为防止他人从你的类上派生新类,此类是不可扩展的。动态调用比静态调用花费的时间要长。 ◆多态类:在java中,对象变量是多态的。而java中不支持多重继承。    ◆抽象类:规定一个或多个抽象方法的类本身必须定义为abstract。 2、FTP FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。 FTP 命令 FTP 的主要操作都是基于各种命令基础之上的。常用的命令有: ◆ 设置传输模式,它包括ASCⅡ(文本) 和BINARY 二进制模式; ◆ 目录操作,改变或显示远程计算机的当前目录(cd、dir/ls 命令); ◆ 连接操作,open命令用于建立同远程计算机的连接;close命令用于关闭连接; ◆ 发送操作,put命令用于传送文件到远程计算机;mput 命令用于传送多个文件到远 程计算机; ◆ 获取操作,get命令用于接收一个文件;mget命令用于接收多个文件。 3、实验过程 3.1 FTP服务器的安装、配置及启动 (1)安装并打开FTP服务器NS-FTP Server.exe ,选择宿主目录,然后保存。 (2)配置FTP服务器NS-FTP Server的端口,最大使用端口:110,并保存。 (3)启动服务 3.2 在MyEcilpse中,JAVA实现FTP上传下载 (1)安装并运行MyEcilpse。 (2)新建Java Class文档 (3)调试并运行Java Class文档 (4)Java实现登录FTP服务器 (5)Java实现FTP上传 (6)Java实现FTP下载 附录:源代码 import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; import java.util.Scanner; import sun.net.TelnetInputStream; import sun.net.TelnetOutputStream; import sun.net.ftp.FtpClient; public class FtpUnit{ private String ip = ""; private String username = ""; private String password = ""; private int port = 110; private String path = ""; FtpClient ftpClient = null; OutputStream os = null; FileInputStream is = null; public FtpUnit(String serverIP, String username, String password) { this.ip = serverIP; this.username = username; this.password = password; } public FtpUnit(String serverIP, int port, String username, String password) { this.ip = serverIP; this.username = username; this.password = password; this.port = port; } /** * 连接ftp服务器 * * @throws IOException */ public boolean connectServer(){ ftpClient = new FtpClient(); try { if(this.port != -1){ ftpClient.openServer(this.ip,this.port); }else{ ftpClient.openServer(this.ip); } ftpClient.login(this.username, this.password); if (this.path.length() != 0){ ftpClient.cd(this.path);// path是ftp服务下主目录的子目录 } ftpClient.binary();// 用2进制上传、下载 System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录"); return true; }catch (IOException e){ e.printStackTrace(); return false; } } /** * 断开与ftp服务器连接 * * @throws IOException */ public boolean closeServer(){ try{ if (is != null) { is.close(); } if (os != null) { os.close(); } if (ftpClient != null) { ftpClient.closeServer(); } System.out.println("已从服务器断开"); return true; }catch(IOException e){ e.printStackTrace(); return false; } } /** * 检查文件夹在当前目录下是否存在 * @param dir * @return */ private boolean isDirExist(String dir){ String pwd = ""; try { pwd = ftpClient.pwd(); ftpClient.cd(dir); ftpClient.cd(pwd); }catch(Exception e){ return false; } return true; } /** * 在当前目录下创建文件夹 * @param dir * @return * @throws Exception */ private boolean createDir(String dir){ try{ ftpClient.ascii(); StringTokenizer s = new StringTokenizer(dir, "/"); //sign s.countTokens(); String pathName = ftpClient.pwd(); while(s.hasMoreElements()){ pathName = pathName + "/" + (String) s.nextElement(); try { ftpClient.sendServer("MKD " + pathName + "\r\n"); } catch (Exception e) { e = null; return false; } ftpClient.readServerResponse(); } ftpClient.binary(); return true; }catch (IOException e1){ e1.printStackTrace(); return false; } } /** * ftp上传 * 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换 * * @param filename 要上传的文件(或文件夹)名 * @return * @throws Exception */ public boolean upload(String filename){ String newname = ""; if(filename.indexOf("/") > -1){ newname = filename.substring(filename.lastIndexOf("/") + 1); }else{ newname = filename; } return upload(filename, newname); } /** * ftp上传 * 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换 * * @param fileName 要上传的文件(或文件夹)名 * @param newName 服务器段要生成的文件(或文件夹)名 * @return */ public boolean upload(String fileName, String newName){ try{ String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK"); File file_in = new File(savefilename);//打开本地待长传的文件 if(!file_in.exists()){ throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!"); } if(file_in.isDirectory()){ upload(file_in.getPath(),newName,ftpClient.pwd()); }else{ uploadFile(file_in.getPath(),newName); } if(is != null){ is.close(); } if(os != null){ os.close(); } return true; }catch(Exception e){ e.printStackTrace(); System.err.println("Exception e in Ftp upload(): " + e.toString()); return false; }finally{ try{ if(is != null){ is.close(); } if(os != null){ os.close(); } }catch(IOException e){ e.printStackTrace(); } } } /** * 真正用于上传的方法 * @param fileName * @param newName * @param path * @throws Exception */ private void upload(String fileName, String newName,String path) throws Exception{ String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK"); File file_in = new File(savefilename);//打开本地待长传的文件 if(!file_in.exists()){ throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!"); } if(file_in.isDirectory()){ if(!isDirExist(newName)){ createDir(newName); } ftpClient.cd(newName); File sourceFile[] = file_in.listFiles(); for(int i = 0; i < sourceFile.length; i++){ if(!sourceFile[i].exists()){ continue; } if(sourceFile[i].isDirectory()){ this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName); }else{ this.uploadFile(sourceFile[i].getPath(),sourceFile[i].getName()); } } }else{ uploadFile(file_in.getPath(),newName); } ftpClient.cd(path); } /** * upload 上传文件 * * @param filename 要上传的文件名 * @param newname 上传后的新文件名 * @return -1 文件不存在 >=0 成功上传,返回文件的大小 * @throws Exception */ public long uploadFile(String filename, String newname) throws Exception{ long result = 0; TelnetOutputStream os = null; FileInputStream is = null; try { java.io.File file_in = new java.io.File(filename); if(!file_in.exists()) return -1; os = ftpClient.put(newname); result = file_in.length(); is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while((c = is.read(bytes)) != -1){ os.write(bytes, 0, c); } }finally{ if(is != null){ is.close(); } if(os != null){ os.close(); } } return result; } /** * 从ftp下载文件到本地 * * @param filename 服务器上的文件名 * @param newfilename 本地生成的文件名 * @return * @throws Exception */ public long downloadFile(String filename, String newfilename){ long result = 0; TelnetInputStream is = null; FileOutputStream os = null; try{ is = ftpClient.get(filename); java.io.File outfile = new java.io.File(newfilename); os = new FileOutputStream(outfile); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); result = result + c; } }catch (IOException e){ e.printStackTrace(); }finally{ try { if(is != null){ is.close(); } if(os != null){ os.close(); } } catch (IOException e) { e.printStackTrace(); } } return result; } /** * 取得相对于当前连接目录的某个目录下所有文件列表 * * @param path * @return */ public List getFileList(String path){ List list = new ArrayList(); DataInputStream dis; try { dis = new DataInputStream(ftpClient.nameList(this.path + path)); String filename = ""; while((filename = dis.readLine()) != null){ list.add(filename); } } catch (IOException e) { e.printStackTrace(); } return list; } public static void main(String[] args){ //FtpUnit ftp = new FtpUnit("","",""); FtpUnit ftp = new FtpUnit("127.0.0.1","ftp","ftp"); ftp.connectServer(); // boolean result = ftp.upload("C:/ftpu/", "web/pp"); // System.out.println(result?"上传成功!":"上传失败!"); //System.out.println("文件列表:"); List list = ftp.getFileList(""); for(int i=0;i

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档