您的位置:首页 > 编程语言 > PHP开发

FTP 和 SFTP上传,以及FTP上传时卡死、连接迟迟关闭不了,耗费资源,以及 SFTP上传时问题

2017-07-06 11:14 3843 查看
首先FTP和SFTP 的详细工具类在这就不贴了 我已经上传上去了。

我在开发中碰到的问题;

传输模式

ASCII传输方式:

支持简单文本文件传输,如果是程序,数据库,字处理文件或者压缩文件(尽管字处理文件包含的大部分是文本,其中也包含有指示页尺寸,字库等信息的非打印字符)中途会转译,导致文件上传上去损坏、无法运行;

二进制传输模式:

在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一一对应的;

工作方式

Standard (也就是 PORT方式,主动方式)

Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。

Passive (也就是PASV,被动方式)

Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个临时端口(也叫自由端口,端口号大于1023小于65535)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。

很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登陆FTP服务器,因为从服务器的TCP 20无法和内部网络的客户端建立一个新的连接,造成无法工作。

FTP 卡死错误 2个问题;

ftpClient.completePendingCommand()

方法的作用 : 同步等待服务器返回响应, 确定代码是一个积极的完成响应的答复。以2开头的所有代码都完成积极响应。(通俗讲就是同步的等待服务器返回一个标识,是否上传成功)·

如果你上传文件的频率很低 如每天一次等那可以忽略这个问题,通过测试发现程序会在卡很久, 我们只是为了拿到一个标识而已为何不换一种方式呢; 比如:

拿本地的文件大小 与 服务器目标文件大小比较 一致则 上传成功;

如果不一致 但 服务器目标文件大于0 ,说明传输中断 网络异常等;

ftpClient.logout();

稍微点点源码就知道 ,这个方法和上面的方法 都是同步的等待一个回应,这块等待的是 退出登录 注销的回应; 所以有时会卡顿 有时没问题,

所以关闭的时候,你可以酌情使用, 直接
ftpClient.disconnect();
也没问题;

SFTP 2个问题;

使用的是JSCH框架;

Session is down

FTP登录用户是否有操作上传目录的权限;

Session 超时时间;

程序上传成功后, 发现目标目录没有存在目标文件

确保你已经进入目标目录之后再上传,

createpath :目标目录
如果文件不存在 直接走到catch 新建并进入目录,
如果存在 进入目录,
如果不存在新建并进入目录;
try{
Vector ls = sftp.ls(createpath);
if( ls == null || ls.isEmpty()) {
//这里注意 mkdir 只能创建最后一层目录,如果是多级,创建失败.(多层的话 建议:  这块可切割 然后循环来 新建并进入;)
sftp.mkdir(createpath);
}
} catch (SftpException e) {
sftp.mkdir(createpath);
sftp.cd(createpath);
}
sftp.cd(createpath);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐