`
super_521
  • 浏览: 49866 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ftp服务器断点上传下载

 
阅读更多
package cn.itcast.crm.util;

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 org.xvolks.jnative.exceptions.NativeException;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import cn.reader.reader.ReadTag;

/**
 * ftp上传,下载

 * 
 * @author why 2009-07-30
 * 
 */
public class FtpUtil {
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 FtpUtil(String serverIP, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
}
public FtpUtil(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("GBK"),
"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) throws NativeException, IllegalAccessException {
FtpUtil ftp = new FtpUtil("192.168.1.105", "user", "123");
ftp.connectServer();
ReadRfidUtils readRfidUtils = new ReadRfidUtils();
ReadTag rea = new ReadTag();
String s = readRfidUtils.read(rea);
boolean result = ftp.upload("D:/54704062201206151502092592944847273_015.jpg", s+".jpg");
System.out.println(result ? "上传成功!" : "上传失败!");
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删除文件
*/
}
}


分享到:
评论

相关推荐

    Java上传文件到FTP服务器,支持断点续传.rar

    上传文件到FTP服务器,支持断点续传,同时支持LINUX主机,代码里面包括了比较多的java网络操作类,比如连接FTP的常规类、递归创建远程服务器目录 上传文件到服务器,新上传和断点续传操作,远程文件名,在上传之前...

    ftp 断点上传、下载demo

    基于apache commons-net.3.2.jar包开发,能实现ftp断点上传、下载、创建目录、切换目录等功能。 说明:需要安装ftp服务器如server-u,filezila等。直接导出的myeclipse java 工程,导入既可以。 环境:myeclipse8.5+...

    ftp例子-上传文件到服务器,新上传和断点续传

    上传文件到服务器,新上传和断点续传 远程文件名,在上传之前已经将服务器工作目录做了改变 本地文件File句柄,绝对路径 需要显示的处理进度步进值 断点续传点

    c#制作FTP上传(支持断点续传)

    实现FTP上传,暂停断点续传等功能。已经测试过了,可以使用。希望大家多给点意见,是功能更完善。

    Android 使用FTP文件传输协议上传文件(支持断点续传 )

    连接FTP服务器,实现文件的上传,删除功能,可以断点续传,支持退出重进App续传,断网重连续传。

    java ftp 多线程 断点续传等知识

    java相关的 ftp知识 如:ftp服务器、ftp主被动通讯模式、断点续传、单个文件多线程下载

    xuchuanftp_java_FTP断点续传_

    Java上传文件到FTP服务器,支持断点续传

    FTP服务器实现代码

    在LINUX下运行的FTP服务器程序,实现上传和下载功能,不支持断点续传

    Android FTP 多线程断点续传下载\上传的实例

    最近在给我的开源下载框架Aria增加FTP断点续传下载和上传功能,在此过程中,爬了FTP的不少坑,终于将功能实现了,在此把一些核心功能点记录下载。 FTP下载原理 FTP单线程断点续传 FTP和传统的HTTP协议有所不同,...

    C#WinFrom程序的FTP服务器上传下载

    可以一步一断点的跟踪学习FTP上传和下载,代码有详细注释

    Android FTP 断点续传,下载,进度条完整Demo

    FTP上传,下载资源,还有断点续传 注意: 上传和下载都是和服务器交互,所以在使用FTP之前需要搭建好FTP服务器. 搭建方式:https://jingyan.baidu.com/article/0bc808fc408fa91bd585b94f.html

    多线程实现ftp断点续传

    实现简单的ftp协议断点续传功能,该部分是通过连接服务器,向服务器上传下载文件进行操作。

    Ftp服务器2.8(20090803)(绿色的极好完全免费FTP服务器)

    断点下载,断点上传; 3.配置多用户; 4.连接日志; 5.在线用户显示; 6.信息统计; 7.可设置自动运行和自动运行时状态; 8.右键盘直接打开本地服务(日志框右键); 9.在线更新(日志框右键); 10....

    FTP上传下载(Delphi7).zip

    Delphi7实现FTP服务器和客户端。ftp上传, ftp下载,支持断点续传,这个例子,供参考学习

    QFTP类实现FTP上传、下载、删除文件及文件夹

    QT4下,采用QFTP实现单个文件上传、下载、改名及刷新。文件夹及子文件上传、改名、刷新。注意:无文件夹及子文件下载

    ftp断点续传,ftp协议网络抓拍数据

    该文件是ftp客户端上传文件到ftp服务器时,网络抓包工具抓取的ftp协议数据,对ftp学习和开发具有极大的参考价值

    comment.net的FTP工具后支持完美的断点上传和下载

    对Apache的comment-net的FTP工具进行了二次开发,优化登录FTP不成功,断点续传不成功。很重要的一点还是ftp服务器上的配置也要正确,不然连接肯定会出问题。

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

    本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量、大文件的上传下载控件。文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp...

    FTP上传下载源码

    当你需要将电脑的某个目录A开放给其它人时,可开启服务端,并将FTP目录指向A,并指定相应的用户、密码,其它人即可通过客户端来进行连接下载了,客户端下载支持断点续传功能,有一定的实用价值。同时客户端也支持将...

    FTP 服务器关于权限的问题

    很多电影网站,论坛或其它机构为了方便会员或成员上传电影或者交流文件,都允许用户的上传权限,因为只有允许这个权限,用户才可以上传文件,但这个权限在允许断点再传的ftp服务器中,可以导致很大的问题出来。...

Global site tag (gtag.js) - Google Analytics