`
JavaCrazyer
  • 浏览: 3008910 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

FTP远程上传下载文件

阅读更多

最近工作中用到FTP知识,感觉比较好用,代码贴在下面

/**
 * 这个是真正执行FTPUtils任务的
 * 
 * @author Administrator
 * 
 */
public class FtpUtils {
	private String ip = "";
	private String username = "";
	private String password = "";
	private int port = -1;
	private String path = "";
	FtpClient ftpClient = null;
	OutputStream os = null;
	FileInputStream is = null;

	public FtpUtils(String serverIP, String username, String password) {
		this.ip = serverIP;
		this.username = username;
		this.password = password;
	}

	public FtpUtils(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(), "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) {
		FtpUtils ftp = new FtpUtils("144.64.131.304", 21, "user", "user");
		ftp.connectServer();
		// 只能上传整个目录中的东西到虚拟目录下的目录
		try {
			// ftp.upload("e:/aa.txt", "ftptargetdir/aa.txt","test");
			// //上传单个文件到单个文件

			ftp.upload("d:/crmtest", "ftptargetdir", ".");// 上传整个文件夹的内容,中文的好像都传不了,DOS命令下可以
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// System.out.println(result?"上传成功!":"上传失败!");
		//
		// List<File> list = ftp.getFileList("vir_dir");
		//
		// for(int i=0;i<list.size();i++){
		//
		// System.out.println(list.get(i).getName());
		//
		// }

		ftp.closeServer();

		/**
		 * FTP远程命令列表
		 * 
		 * USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT
		 * 
		 * PASS PASV STOR REST CWD STAT RMD XCUP OPTS
		 * 
		 * ACCT TYPE APPE RNFR XCWD HELP XRMD STOU AUTH
		 * 
		 * REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ
		 * 
		 * QUIT MODE SYST ABOR NLST MKD XPWD MDTM PROT
		 * 
		 * 在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n
		 * 
		 * ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令
		 * 
		 * ftpclient.readServerResponse一定要在sendServer后调用
		 * 
		 * nameList("/test")获取指目录下的文件列表
		 * 
		 * XMKD建立目录,当目录存在的情况下再次创建目录时报错
		 * 
		 * XRMD删除目录
		 * 
		 * DELE删除文件
		 */

	}

}

 

4
0
分享到:
评论
3 楼 learnoracle10g 2015-03-20  
[color=violet][/color]我[size=medium][/size]
2 楼 JavaCrazyer 2010-11-03  
kettas 写道
写的什么代码,好事做到底,所需要的文件都不齐。不知道你是复制的还是怎么的。

首先说明下,写博客肯定是复制已有的东西,难道你在博客上敲代码么?如是在下佩服。其次呢,我的代码写的是不怎么好,况且我也没想做啥好事。最后呢,我这个类的确就是个单独的类,Constant不过就是获得文件目录的么,你不会手动写一个么,其他并没有少什么,如果不愿意看你可以选择看别人的代码,OK?
1 楼 kettas 2010-11-03  
写的什么代码,好事做到底,所需要的文件都不齐。不知道你是复制的还是怎么的。

相关推荐

    FTP远程上传下载资源工具

    FTP工具如"FTP远程上传下载资源工具"是实现FTP文件传输的客户端软件,它为用户提供了友好的界面,使得非技术人员也能方便地进行文件的上传与下载。 在描述中提到的“FTP工具 资源上传”,这主要指FTP工具的一个关键...

    Ftp远程上传工具,很实用

    FlashFXP是一款流行的FTP客户端软件,它为用户提供了简单直观的界面来执行FTP远程上传操作。 1. FTP基本概念: FTP允许用户在本地计算机(客户端)和远程服务器(FTP服务器)之间交换文件。它分为两种模式:ASCII...

    springboot以FTP方式上传文件到远程服务器的流程

    Spring Boot 中使用 FTP 上传文件到远程服务器的流程 在本文中,我们将介绍如何使用 Spring Boot 实现 FTP 上传文件到远程服务器的流程。这个流程包括如何使用 JWT 登录认证及鉴权的流程,以及如何使用 Spring ...

    java+jsp代码实现从FTP服务器上传下载文件

    根据给定的信息,本文将详细解释如何利用Java与JSP技术来实现从FTP服务器上传下载文件的功能,并且会对部分给出的代码片段进行解读。 ### Java + JSP 实现 FTP 文件上传下载 #### 一、JSP 页面代码实现 在JSP页面...

    springboot以FTP方式上传文件到远程服务器

    "Spring Boot 使用 FTP 方式上传文件到远程服务器" 在本文中,我们将详细介绍如何使用 Spring Boot 框架来实现 FTP 方式上传文件到远程服务器。FTP(File Transfer Protocol)是一种常用的文件传输协议,广泛应用于...

    ftp 上传远程文件

    然后,使用`put`命令将本地文件上传到服务器,或者使用`mput`批量上传文件。 然而,Windows内置的FTP命令行工具可能对新手不够友好,这时可以考虑使用像WinSCP这样的第三方工具。WinSCP429setup.exe很可能是WinSCP...

    Ftp 文件上传下载 源代码

    4. **文件上传与下载**:源代码会包含实现FTP上传和下载的函数,可能使用FTP的STOR(存储)命令上传文件,使用RETR(检索)命令下载文件。 5. **目录浏览**:可能通过FTP的LIST和NLST命令获取服务器目录信息,并...

    FTP文件上传和下载管理类(C++)

    在C++中实现FTP功能,可以帮助开发者实现在本地计算机与远程服务器之间的文件上传和下载。 FTPManager类是这个压缩包的核心,它封装了FTP协议的相关操作,使得在C++程序中使用FTP变得更加简单。FTPManager.cpp和...

    PHP远程上传文件到FTP

    在PHP编程中,远程上传文件到FTP服务器是一项常见的任务,特别是在网站内容管理、文件分发或备份场景下。本文将详细讲解如何使用PHP实现这一功能,以及涉及的相关知识点。 首先,要实现远程上传,我们需要了解PHP的...

    VB FTP文件上传、下载

    4. **文件上传**:在VB中,使用FTP命令`STOR`或对应的API方法上传文件。这通常涉及读取本地文件,打开FTP连接,发送文件数据,并确保正确关闭连接。 5. **文件下载**:通过`RETR`命令或相应的API方法下载文件。这...

    C#WinForm做FTP上传下载获取文件列表齐全

    根据给定的文件信息,我们可以总结出以下关于使用C# WinForm进行FTP上传、下载以及获取文件列表的关键知识点: ### C# WinForm与FTP交互基础知识 在C#中,使用WinForm开发图形用户界面(GUI)应用时,可以通过.NET...

    Java实现FTP文件上传和下载

    5. **文件上传**:使用`storeFile()`方法上传文件。你需要提供远程文件路径和一个InputStream,这个InputStream通常来自本地文件。 ```java File localFile = new File("C:\\local\\file.txt"); InputStream in = ...

    ftp 远程dos命令上传文件

    在压缩包中的"FTP 上传文件"可能是一个批处理脚本(`.bat`文件),包含了上述FTP命令的组合,用于自动执行文件上传。这个脚本可以包含错误检查、日志记录等高级功能,以确保上传过程的可靠性和可追溯性。 总之,...

    FTP 实现远程上传下载

    本教程将深入讲解如何实现FTP的远程上传与下载功能。 FTP的工作基于TCP协议,分为两种模式:主动模式和被动模式。主动模式下,客户端首先建立一个控制连接,然后服务器发起数据连接。而在被动模式中,服务器开启一...

    FTP文件上传下载器

    3. **FTP命令**:FTP协议定义了一系列命令,如`USER`(提供用户名)、`PASS`(提供密码)、`CWD`(改变工作目录)、`LIST`(列出目录内容)、`PUT`(上传文件)、`GET`(下载文件)等。 4. **数据传输**:FTP使用两...

    ftp上传下载图片

    在这里,我们讨论了 FTP 协议的基础知识,并实现了一个 C# 类,用于实现 FTP 操作,包括连接 FTP、上传文件、下载文件、删除文件和判断文件是否存在。这个类可以作为 FTP 操作的工具类,用于实现各种 FTP 操作。

    Java实现FTP批量大文件上传下载

    上传小于 1M 文件速度要比用 FTP 协议上传文件略快。但对于批量及大文件的传输可能无能为力。后来决定采用 FTP 协议上传文件大于 1M 的文件速度比 HTTP 快。文件越大,上传的速度就比 HTTP 上传的速度快数倍。 二、...

    java实现ftp文件上传及下载源码

    Java FTP文件上传与下载是Java开发中常见的网络编程任务,主要涉及的是FTP(File Transfer Protocol)协议的应用。在本资源中,提供了实现FTP文件上传和下载功能的源码,包括了FTP连接、文件上传和下载的逻辑,以及...

Global site tag (gtag.js) - Google Analytics