我需要从ftp服务器获取响应消息我正在对连接进行故障排除,因此我使用PHP的ftp_raw功能,这允许我将原始ftp命令发送到远程服务器,并获取响应字符串.(内置的PHP ftp命令不返回响应:(
按照这个接受的答案,我发送的命令是
PASV
STOR /local/path/to/file.txt
Run Code Online (Sandbox Code Playgroud)
服务器响应是
500 /local/path/to/file.txt: The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)
我在想自己"当然,远程主机不知道我的本地文件系统." 我的预感是我正在打开一个套接字,指定一个远程文件名,我仍然需要管理数据.但我在搜索中没有找到任何结论性的文件.
上传文件的完整原始ftp命令是什么?在什么时候,以及如何实际开始向远程服务器发送数据?我可以使用从ftp_connect() 套接字设置的连接吗?
And*_*ron 17
免责声明:你应该知道的第一件事是RFC99在FTP变得流行之后写了一段时间,并且仍然存在一些基于RFC959发布之前(以及之后的一段时间)缺乏规范的软件.许多较旧(且更稳定)的FTP库对某些服务器有一些特殊处理,以确保它以99.9%的时间以您想要的方式工作.这在处理FTP协议的扩展时尤其常见.
我的其余部分假设服务器符合RFC959.
另请注意,绕过FTP客户端库的更高级别请求/响应管理意味着您需要自己重新实现此库的一部分.这意味着您应该熟悉规范,因为您需要参考它.在可能的情况下,我会参考相应的部分,以便您可以到处走走.
在一个案例中,我强烈建议您通过使用PHP的FTP客户端库调试您的问题,而不是自己实现所有这些.它是可能的,你应该真的要求库输出它正在使用的所有命令.尽管如此,我仍然会指导您完成帮助诊断问题的程序.
管理FTP数据连接有点痛苦.如果您想支持规范的所有可选部分,它并不像第一眼看上去那么容易.您传输文件的具体方式主要取决于以下选项的当前状态:
请注意规范,因为某些配置允许您保持数据连接打开而其他配置可能需要您关闭它(例如流模式).如果数据连接已打开,则无需在每次传输时重新连接到服务器.
所有这一切看起来都非常复杂,但它只是提供了丰富的信息.在调试时它可能会派上用场.实际上只有两种流行的方法可以使用FTP传输文件:
服务器在第二个端口上连接到客户端,并使用文件数据结构以图像(二进制)数据类型发送文件.
配置数据类型(必需):
TYPE I
配置数据结构(可选,默认):
STRU F.
配置传输模式(可选,默认):
模式S.
选择一个可用的端口(这可能比你想象的更微妙)并开始聆听.如果选择默认端口(20),请跳过下一步.
选择端口,创建套接字,监听选定的端口.
告诉服务器我们将在一个给定的端口上监听(如果选择了默认端口,则可选,但要注意不要伤害):
PORT your-public-ip-address,selected-port
告诉服务器期望文件传输:
STOR远程文件名
等待来自服务器的传入连接.
发送文件内容
打开文件,发送内容,关闭文件
关闭数据连接
关闭套接字.
客户端连接到第二个端口上的服务器,并使用文件数据结构以图像(二进制)数据类型发送文件.
配置数据类型(必需):
TYPE I
配置数据结构(可选,默认):
STRU F.
配置传输模式(可选,默认):
模式S.
告诉服务器我们将在给定端口上监听(必需):
PASV
读取PASV包含服务器正在侦听的IP地址和端口号的命令响应.
告诉服务器期望文件传输:
STOR远程文件名
建立连接:
从
PASV响应连接到服务器上的IP地址和端口号
发送文件内容
打开文件,发送内容,关闭文件
关闭数据连接
关闭套接字.
第一种方法存在一些不方便的问题,因为选择端口有点棘手(在使用端口之后,您需要等待一段时间才能再次使用它)并且您的防火墙或ISP可能会阻止某些端口上的传入连接等第二种方法最简单,除非服务器拒绝它,否则应该是首选方法.
| 归档时间: |
|
| 查看次数: |
27955 次 |
| 最近记录: |