`
83026191
  • 浏览: 45349 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ftp传输

    博客分类:
  • java
阅读更多
package com.zy.ftp;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.StringTokenizer;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;

public class FTPConnectorBK {
private FtpClient ftpclient;
private String ipAddress;
private int ipPort;
private String userName;
private String PassWord;
   
public  FTPConnectorBK(){};
/** */
/**
* 构造函数
*
* @param ip
*            String 机器IP
* @param port
*            String 机器FTP端口号
* @param username
*            String FTP用户名
* @param password
*            String FTP密码
* @throws Exception
*/
public  FTPConnectorBK(String ip, int port, String username,
String password) throws Exception {

ipAddress = new String(ip);
ipPort = port;
// System.out.println("1......"+ftpclient.serverIsOpen());
ftpclient = new FtpClient(ipAddress, ipPort);
// ftpclient = new FtpClient();
System.out.println("2......" + ftpclient.serverIsOpen());
// ftpclient = new FtpClient(ipAddress);
userName = new String(username);
PassWord = new String(password);
}

/** */
/**
* 构造函数
*
* @param ip
*            String 机器IP,默认端口为21
* @param username
*            String FTP用户名
* @param password
*            String FTP密码
* @throws Exception
*/
public FTPConnectorBK(String ip, String username, String password)
throws Exception {
ipAddress = new String(ip);
ipPort = 21;
ftpclient = new FtpClient(ipAddress, ipPort);
// ftpclient = new FtpClient(ipAddress);
userName = new String(username);
PassWord = new String(password);
}

/** */
/**
* 登录FTP服务器
*
* @throws Exception
*/
public void login() throws Exception {
System.out.println("b......" + ftpclient.welcomeMsg);
System.out.println(userName);
System.out.println(PassWord);
ftpclient.login(userName, PassWord);
ftpclient.setConnectTimeout(30);
System.out.println("getReadTimeout..." + ftpclient.getReadTimeout());
System.out.println("getConnectTimeout..."
+ ftpclient.getConnectTimeout());
System.out.println("e......" + ftpclient.welcomeMsg);
}

/** */
/**
* 退出FTP服务器
*
* @throws Exception
*/
public void logout() throws Exception {
// 用ftpclient.closeServer()断开FTP出错时用下更语句退出
System.out.println("10......" + ftpclient.serverIsOpen());
ftpclient.sendServer("QUIT");
int reply = ftpclient.readServerResponse(); // 取得服务器的返回信息
System.out.println("reply...." + reply);
System.out.println("11......" + ftpclient.serverIsOpen());
ftpclient.closeServer();
System.out.println("12......" + ftpclient.serverIsOpen());

}

/** */
/**
* 在FTP服务器上建立指定的目录,当目录已经存在的情下不会影响目录下的文件,这样用以判断FTP
* 上传文件时保证目录的存在目录格式必须以"/"根目录开头
*
* @param pathList
*            String
* @throws Exception
*/
public void buildList(String pathList) throws Exception {
ftpclient.ascii();
StringTokenizer s = new StringTokenizer(pathList, "/"); // sign
int count = s.countTokens();
String pathName = "";
while (s.hasMoreElements()) {
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpclient.sendServer("XMKD" + pathName + " ");
} catch (Exception e) {
e = null;
}
int reply = ftpclient.readServerResponse();
System.out.println(reply);
}
ftpclient.binary();
}

/** */
/**
* 取得指定目录下的所有文件名,不包括目录名称 分析nameList得到的输入流中的数,得到指定目录下的所有文件名
*
* @param fullPath
*            String
* @return ArrayList
* @throws Exception
*/
public ArrayList fileNames(String fullPath) throws Exception {
ftpclient.ascii(); // 注意,使用字符模式
ftpclient.cd("/freep");
// ftpclient.cdUp();
// TelnetInputStream list = ftpclient.nameList(fullPath);
TelnetInputStream list = ftpclient.list();

byte[] names = new byte[2048];
int bufsize = 0;
bufsize = list.read(names, 0, names.length); // 从流中读取
list.close();
ArrayList namesList = new ArrayList();
int i = 0;
int j = 0;
while (i < bufsize /**//* names.length */) {
// System.out.println(i);
// char bc = (char) names;
// System.out.println(i + " " + bc + " : " + (int) names);
// i = i + 1;
if (names[i] == 10) { // 字符模式为10,二进制模式为13
System.out.println("j...." + j);
// 文件名在数据中开始下标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
// System.out.write(names, j, i - j);
// System.out.println(j + " " + i + " " + (i - j));
String tempName = new String(names, j, i - j);
namesList.add(tempName);
System.out.println(tempName);
// 处理代码处
// j = i + 2; // 上一次位置二进制模式
j = i + 1; // 上一次位置字符模式
}
i = i + 1;
}
return namesList;
}

/** */
/**
* 上传文件到FTP服务器,destination路径以FTP服务器的"/"开始,带文件名、
*  上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖
*
* @param source
*            String
* @param destination
*            String
* @throws Exception
*/
public void upFile(String source, String destination) throws Exception {
System.out.println("ccccccccccccccccccccccc"+source);
buildList(destination.substring(0, destination.lastIndexOf("/")));
ftpclient.binary(); // 此行代码必须放在buildList之后  该命令可把传输格式设置为二进制格式。
TelnetOutputStream ftpOut = ftpclient.put(destination);
TelnetInputStream ftpIn = new TelnetInputStream(new FileInputStream(
source), true);
byte[] buf = new byte[204800];
int bufsize = 0;
while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
ftpOut.write(buf, 0, bufsize);
}
ftpIn.close();
ftpOut.close();

}

/** */
/**
* JSP中的流上传到FTP服务器, 上传文件只能使用二进制模式,当文件存在时再次上传则会覆盖 字节数组做为文件的输入流,此方法适用于JSP中通过
* request输入流来直接上传文件在RequestUpload类中调用了此方法, destination路径以FTP服务器的"/"开始,带文件名
*
* @param sourceData
*            byte[]
* @param destination
*            String
* @throws Exception
*/
public void upFile(byte[] sourceData, String destination) throws Exception {
buildList(destination.substring(0, destination.lastIndexOf(" / ")));
ftpclient.binary(); // 此行代码必须放在buildList之后 一定要使用二进制模式
TelnetOutputStream ftpOut = ftpclient.put(destination);  //以写方式打开一输出流,通过这一输出流把文件filename传送到远程计算机。
ftpOut.write(sourceData, 0, sourceData.length);
// ftpOut.flush();
ftpOut.close();
}

/** */
/**
* 从FTP文件服务器上下载文件SourceFileName,到本地destinationFileName 所有的文件名中都要求包括完整的路径名在内
*
* @param SourceFileName
*            String
* @param destinationFileName
*            String
* @throws Exception
*/
public void downFile(String SourceFileName, String destinationFileName)
throws Exception {
ftpclient.binary(); // 一定要使用二进制模式
TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
byte[] buf = new byte[204800];
int bufsize = 0;
FileOutputStream ftpOut = new FileOutputStream(destinationFileName);
while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
ftpOut.write(buf, 0, bufsize);
}
ftpOut.close();
ftpIn.close();
}

/** */
/**
* 从FTP文件服务器上下载文件,输出到字节数组中
*
* @param SourceFileName
*            String
* @return byte[]
* @throws Exception
*/
public byte[] downFile(String SourceFileName) throws Exception {
ftpclient.binary(); // 一定要使用二进制模式
TelnetInputStream ftpIn = ftpclient.get(SourceFileName);
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
byte[] buf = new byte[204800];
int bufsize = 0;

while ((bufsize = ftpIn.read(buf, 0, buf.length)) != -1) {
byteOut.write(buf, 0, bufsize);
}
byte[] return_arraybyte = byteOut.toByteArray();
byteOut.close();
ftpIn.close();
return return_arraybyte;
}
/** */
/**
* 调用示例 FtpUpfile fUp = new FtpUpfile("192.150.189.22", 21, "admin",
* "admin"); fUp.login(); fUp.buildList("/adfadsg/sfsdfd/cc"); String
* destination = "/test.zip"; fUp.upFile("C:\Documents and
* Settings\Administrator\My Documents\sample.zip",destination); ArrayList
* filename = fUp.fileNames("/"); for (int i = 0; i < filename.size(); i++) {
* System.out.println(filename.get(i).toString()); } fUp.logout();
*
* @param args
*            String[]
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// FTPConnectorBK fUp = new FTPConnectorBK( "192.168.1.230" , 21 ,
// "admin" , "sanco_freep" );
//Ftp端口号 一般都是21
FTPConnectorBK fUp = new FTPConnectorBK("10.113.58.113", 21, "zhu","zy");
System.out.println("fUp......" + fUp.ftpclient.serverIsOpen());
fUp.login();

System.out.println("login()......" + fUp.ftpclient.serverIsOpen());
// fUp.fileNames("/freep");
System.out.println("1......begin");
//上传到Ftp方法
fUp.upFile("D:/项目文档/阿布达日铁矿.doc", "/阿布达日铁矿.doc");//第一个参数文件的位置 , 第2个参数文件上传后的名字
//在ftp上下载下来
//fUp.downFile("/阿布达日铁矿.doc", "D:/阿布达日铁矿.doc");

System.out.println("1......end");

String ss = fUp.ftpclient.pwd();//该命令可显示远程系统上的目录状态。
System.out.println("ss......" + ss);
System.out.println("option......" + fUp.ftpclient.serverIsOpen());
// fUp.deleteFile();
// 建立文件目录
// fUp.buildList("/adfadsg/sfsdfd/cc");

// String destination = "/test/SetupDJ.rar";
// fUp.upFile(
// "C:\Documents and Settings\Administrator\My Documents\SetupDJ.rar",
// destination);
// ArrayList filename = fUp.fileNames("/");
// for (int i = 0; i < filename.size(); i++) {
// System.out.println(filename.get(i).toString());
// }
//
// fUp.downFile("/sample.zip", "d:\sample.zip");

// 文件上传
// FileInputStream fin = new FileInputStream(
// "d://37.jpg" );
// byte [] data = new byte [ 20480000 ];
// fin.read(data, 0 , data.length);

fUp.logout();
System.out.println("fUp.logout()......" + fUp.ftpclient.serverIsOpen());
System.out.println(" 程序运行完成! ");
/**//*
* 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命令都要加上
* ftpclient.sendServer("XMKD /test/bb "); //执行服务器上的FTP命令
* ftpclient.readServerResponse一定要在sendServer后调用
* nameList("/test")获取指目录下的文件列表 XMKD建立目录,当目录存在的情况下再次创建目录时报错 XRMD删除目录
* DELE删除文件
*/
}

public void deleteFile() throws Exception {
ftpclient.ascii();
ftpclient.sendServer("DELE " + "/freep/jpg/37.jpg" + " ");
int reply = ftpclient.readServerResponse();
System.out.println(reply);
}

}
分享到:
评论

相关推荐

    ftp传输源码ftp传输源码

    在本文中,我们将深入探讨FTP传输的核心概念、工作原理以及相关源码解析。 FTP的工作原理分为两个主要部分:控制连接和数据连接。控制连接主要用于发送命令和接收响应,如登录、列出目录、传输文件等。数据连接则...

    在PB中实现ftp传输

    ### 在PB中实现FTP传输的关键知识点 #### 一、引言 在PowerBuilder(简称PB)的开发过程中,经常需要实现文件传输功能,尤其是FTP(File Transfer Protocol)传输。一个典型的场景是将PB中的数据窗口生成TXT文件后...

    FTP传输文件的源码 基于服务器

    FTP传输文件时,会开启数据通道。在主动模式下,服务器会告诉客户端它将监听哪个端口,然后客户端连接到该端口进行文件传输。被动模式下,客户端首先告知服务器其数据端口,服务器随后连接到客户端的指定端口。无论...

    一个用FTP传输文件的例子.rar

    同时,我们还会关注如何在实际操作中设置和执行FTP传输。 TIndy是Delphi和C++Builder开发环境中的一套网络组件,它提供了全面的网络通信功能,包括FTP协议的支持。在使用TIdFTP组件进行FTP传输时,你需要创建一个...

    ftp传输软件

    FTP传输软件是网络数据交换的重要工具,主要用于在本地计算机与远程服务器之间进行文件的上传、下载和管理。这里我们以“WinSCP”为例,详细探讨FTP传输软件的相关知识点。 WinSCP是一款免费且开源的FTP(文件传输...

    新代系统FTP传输说明

    详细说明了新代系统与电脑的连接及数据传输。让操作者能清晰明了的操作。

    通用FTP传输平台,支持多路传输

    "通用FTP传输平台"是指一个专门设计用于高效、安全地执行FTP文件传输任务的软件系统。这样的平台通常具有高度可配置性和扩展性,以满足不同用户和组织的需求。 FTP传输平台的关键特性包括: 1. **多路传输**:此...

    一个用FTP传输文件的例子.rar_FTP传输文件_delphi附件_ftp_ftp delphi_传输附件

    Delphi中实现FTP传输通常会利用 Indy 或 Synapse 这样的第三方库。这两个库都包含了处理FTP连接和文件操作的组件。例如,Indy 提供了 TIdFTP 组件,而 Synapse 提供了 TFtp 和 TNetSocket 等组件。这些组件提供了...

    FTP.rar_FTP传输文件_ftp java_java ftp_java 文件传输_文件传输

    被动模式适用于通过防火墙或NAT设备进行FTP传输,它通过服务器指定一个新的端口来接收数据,而不是由客户端主动打开一个端口。 在Java中实现FTP文件传输,我们还需要关注资源的释放。当文件传输完成后,记得使用`...

    ftp_demo 基于C#的Unity Android应用 FTP传输

    用Unity做的Android应用,基于C#的FTP文件传输Demo。工程可直接打包APK安装在两个安卓设备上,一个作为服务端,另一个作为接收端。已测试。如有疑问,请留言

    基于QT5的FTP传输,支持断点续传

    基于QT5的FTP传输,已经经过测试,支持断点续传。 基于qt5、、、QFtp类来自:https://qt.gitorious.org/qt/qtftp/source/8f60c8c0adca6e6183fb31b528d306439ca2d2c1: 更改qftp类中get函数,添加REST命令,实现断点...

    vb6 强大的 ftp 传输类库

    为了方便开发人员实现FTP功能,有专门的类库被设计出来,提供强大的FTP传输能力。本资源提供的就是一个基于Winsock控件实现的FTP传输类库,它可以帮助VB6开发者轻松地在应用程序中集成FTP功能。 Winsock是Windows...

    FANUC 以太网传输DNC-FTP软件

    6. **安全考虑**:使用FTP传输数据时,应考虑数据加密,以防止未经授权的访问和数据泄露。 FANUC 以太网传输DNC-FTP软件的运用,不仅简化了生产流程,降低了人工干预的必要,还提升了加工精度和一致性。对于大型...

    一个用FTP传输文件的例子(delphi)

    FTP传输文件涉及到的主要知识点包括: 1. **FTP协议基础**:FTP基于TCP/IP协议族,分为命令通道和数据通道,用于客户端和服务器之间的文件交互。FTP协议提供了多种操作,如下载、上传、删除、重命名等。 2. **...

    ftp传输脚本.zip

    在这个名为"ftp传输脚本.zip"的压缩包文件中,包含了一个或多个与FTP传输相关的脚本文件。 FTP脚本的基本结构通常包括登录服务器、切换目录、列出文件、上传或下载文件、断开连接等操作。使用FTP脚本的优点在于它...

    FTP传输控件.zip

    FTP传输控件是一种在软件开发中用于实现在应用程序内进行FTP(File Transfer Protocol)文件传输功能的组件。这个“FTP传输控件.zip”文件提供了一个无需授权即可使用的FTP客户端控件,适合开发者快速集成到他们的...

    PB中实现ftp传输

    本文将深入探讨在PB中实现FTP传输的不同方法,包括通过批处理脚本、利用InternetTransfer控件以及采用第三方控件Mabry Internet FTP/X Control来实现。 ### 一、使用批处理脚本实现FTP传输 在PowerBuilder中,可以...

    Serv-U(FTP传输)

    在FTP传输中, Serv-U扮演了服务器端的角色,它允许用户通过FTP客户端连接并上传或下载文件。用户可以创建多个虚拟服务器,每个服务器可以根据需要配置不同的用户账号和目录权限,这样就可以为不同的用户提供定制化...

Global site tag (gtag.js) - Google Analytics