文件传输协议(FTP:File Transfer Protocol)使得主机间可以共享文件。 FTP 使用 TCP 生成一个虚拟连接用于控制信息,然后再生成一个单独的 TCP 连接用于数据传输。控制连接使用类似 TELNET 协议在主机间交换命令和消息。文件传输协议是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。FTP客户机可以给服务器发出命令来下载文件,上传文件,创建或改变服务器上的目录。
Java FTP 实现跨服务器文件上传下载
实现原理:文件存储服务器端安装 Serv-U FTP服务器,环境配好后通过Java程序访问(读取、写入等操作)目录:
Serv-U服务器环境配好之后,本机可通过在 Windows 资源管理器或浏览器中打开 FTP 站点测试能否访问,如:ftp://192.168.1.2
输入用户名、密码点击登录后便可访问共享目录,访问目的用以测试Serv-U服务器环境是否搭建成功。
具体Serv-U服务器相关配置信息详见资源内介绍,在此不累赘描述,Serv-U下载地址:http://download.csdn.net/detail/for_china2012/6574769
Serv-U服务器环境搭建成功后,便可通过Java程序访问:
- package com.ftp.util;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import org.apache.commons.net.ftp.FTPClient;
- import org.apache.commons.net.ftp.FTPReply;
- /**
- * FTP服务器工具类
- *
- * @author 码农先生
- * @version 1.0
- * @date 2013-11-18
- */
- public class FTPUtil {
- /**
- * 上传文件至FTP服务器
- *
- * @param url
- * 服务器IP地址
- * @param port
- * 服务器端口
- * @param userName
- * 用户登录名
- * @param password
- * 用户登录密码
- * @param storePath
- * 服务器文件存储路径
- * @param fileName
- * 服务器文件存储名称
- * @param is
- * 文件输入流
- * @return
- * <b>true</b>:上传成功
- * <br/>
- * <b>false</b>:上传失败
- */
- public static boolean storeFile (String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
- boolean result = false;
- FTPClient ftp = new FTPClient();
- try {
- // 连接至服务器,端口默认为21时,可直接通过URL连接
- ftp.connect(url ,port);
- // 登录服务器
- ftp.login(userName, password);
- // 判断返回码是否合法
- if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
- // 不合法时断开连接
- ftp.disconnect();
- // 结束程序
- return result;
- }
- // 设置文件操作目录
- ftp.changeWorkingDirectory(storePath);
- // 设置文件类型,二进制
- ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
- // 设置缓冲区大小
- ftp.setBufferSize(3072);
- // 上传文件
- result = ftp.storeFile(fileName, is);
- // 关闭输入流
- is.close();
- // 登出服务器
- ftp.logout();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 判断输入流是否存在
- if (null != is) {
- // 关闭输入流
- is.close();
- }
- // 判断连接是否存在
- if (ftp.isConnected()) {
- // 断开连接
- ftp.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- /**
- * 从FTP服务器下载文件至本地
- *
- * @param url
- * 服务器IP地址
- * @param port
- * 服务器端口
- * @param userName
- * 用户登录名
- * @param password
- * 用户登录密码
- * @param remotePath
- * 服务器文件存储路径
- * @param fileName
- * 服务器文件存储名称
- * @param localPath
- * 本地文件存储路径
- * @return
- * <b>true</b>:下载成功
- * <br/>
- * <b>false</b>:下载失败
- */
- public static boolean retrieveFile (String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
- boolean result = false;
- FTPClient ftp = new FTPClient();
- OutputStream os = null;
- try {
- // 连接至服务器,端口默认为21时,可直接通过URL连接
- ftp.connect(url ,port);
- // 登录服务器
- ftp.login(userName, password);
- // 判断返回码是否合法
- if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
- // 不合法时断开连接
- ftp.disconnect();
- // 结束程序
- return result;
- }
- // 设置文件操作目录
- ftp.changeWorkingDirectory(remotePath);
- // 设置文件类型,二进制
- ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
- // 设置缓冲区大小
- ftp.setBufferSize(3072);
- // 设置字符编码
- ftp.setControlEncoding("UTF-8");
- // 构造本地文件对象
- File localFile = new File(localPath + "/" + fileName);
- // 获取文件操作目录下所有文件名称
- String[] remoteNames = ftp.listNames();
- // 循环比对文件名称,判断是否含有当前要下载的文件名
- for (String remoteName: remoteNames) {
- if (fileName.equals(remoteName)) {
- result = true;
- }
- }
- // 文件名称比对成功时,进入下载流程
- if (result) {
- // 构造文件输出流
- os = new FileOutputStream(localFile);
- // 下载文件
- result = ftp.retrieveFile(fileName, os);
- // 关闭输出流
- os.close();
- }
- // 登出服务器
- ftp.logout();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- // 判断输出流是否存在
- if (null != os) {
- // 关闭输出流
- os.close();
- }
- // 判断连接是否存在
- if (ftp.isConnected()) {
- // 断开连接
- ftp.disconnect();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- return result;
- }
- public static void main(String[] args) {
- // try {
- // FileInputStream fis = new FileInputStream(new File("D:/Soft Storage/软件工具箱/HTML_Help_WorkShop_1.3_XiaZaiBa.zip"));
- // System.out.println(storeFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", RandomUUID.random() + ".zip", fis));
- // } catch (FileNotFoundException e) {
- // e.printStackTrace();
- // }
- System.out.println(retrieveFile("192.168.1.2", 21, "admin", "1", "C:/Documents and Settings/Administrator/桌面", "ab86b6a3fbd14b94bdbac6b9aa971a99.zip", "C:/Users/Administrator/Desktop"));
- }
- }