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删除文件
*/
}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言实现FTP断点续传是一项比较复杂的任务,需要对FTP协议有深刻的理解和对C语言编程的熟练掌握。 首先,需要在客户端实现文件的上传和下载功能,并保留上传或下载过程中的文件偏移量,以便进行断点续传。在上传或下载过程中,如果出现中断或错误,可以通过记录文件偏移量和已上传或已下载的字节数来恢复续传。 其次,需要在FTP服务器端实现断点续传的支持。FTP服务器需要提供REST命令,该命令用于设置文件传输的起始偏移量。当客户端发起断点续传的请求时,服务端需要根据请求中记录的文件偏移量和已上传或下载的字节数,调用REST命令设置传输起始偏移量,以便从上一次中断的位置继续传输文件。 最后,需要在客户端和服务器端加入对传输进度的监控和日志记录,以便在发生错误或中断时能够更方便地找到原因,并进行相应的处理。 总的来说,FTP断点续传的实现需要在客户端和服务器端都进行相应的编码,需要对FTP协议及其相关命令有足够的理解,并需要细致地处理各种异常情况,才能保证传输的准确性和可靠性。 ### 回答2: FTP (File Transfer Protocol) 是一种用于在计算机网络间传输文件的标准协议,而断点续传则是指在传输中断后恢复传输时只需要传输未完成的部分,而不必重新传输整个文件。在 C 语言中实现 FTP 断点续传需要以下步骤: 1. 连接 FTP 服务器:使用 socket 函数创建一个连接到 FTP 服务器的 socket,然后使用 connect 函数连接到 FTP 服务器的 IP 地址和端口号。 2. 登录 FTP 服务器:使用 send 函数发送用户和密码信息到 FTP 服务器,以实现登录到 FTP 服务器。 3. 选择目录和文件:使用 send 函数发送要上传或下载的文件名和文件路径,以实现选择目录和文件。 4. 初始化传输:使用 send 函数发送 REST(Resume Transfer)命令和文件偏移量信息,以初始化传输。 5. 开始传输:使用 send 和 recv 函数进行文件传输,并在过程中记录已传输的字节数和剩余的字节数,以支持断点续传。 6. 传输结束:使用 send 函数发送 QUIT 命令以退出 FTP 服务器。 以上是使用 C 语言实现 FTP 断点续传的基本步骤,其中还需要考虑一些细节问题,如错误处理、超时设置、文件传输模式等。同时,为了实现更高效的 FTP 断点续传,还需要使用多线程或者异步 I/O 等技术,以提高传输速度和可靠性。 ### 回答3: FTP是文件传输协议,而断点续传指的是在文件传输过程中,若传输中断,可以不需要重新传输整个文件,而是从中断的地方继续传输,以减少传输时间和流量的浪费。在C语言中,实现FTP断点续传的方法如下: 1. 建立FTP连接 使用socket库中的函数建立客户端与FTP服务器的连接,例如使用socket函数创建一个套接字,然后使用connect函数连接到FTP服务器。 2. 读取文件指针位置 在传输时可以使用ftell函数获取当前文件指针位置,用于记录上一次传输的位置。 3. 断点传输 若传输过程中出现中断,可以通过记录的上一次文件指针位置开始传输,使用fseek函数将文件指针移动到上一次读取的位置,接着继续使用send或recv函数进行文件传输。 4. 传输完成 当文件传输完成时,关闭FTP连接,释放套接字。 需要注意的是,FTP断点续传需要服务器端支持断点续传,即在FTP服务器端需要开启断点续传的相关支持,否则客户端进行断点续传也无法成功。而且,在进行断点续传的过程中,需要保证文件的一致性和完整性,防止数据被篡改或重复传输,因此还需要进行文件校验和验证。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值