STOR命令的正确用户

时间:2012-03-08 20:41:26

标签: ftp

我需要从ftp服务器获取响应消息我正在对连接进行故障排除,因此我使用PHP的ftp_raw函数,这允许我将原始ftp命令发送到远程服务器,并获取回复字符串。 (内置的PHP ftp命令不返回响应:(

this接受回答后,我发送的命令是

PASV
STOR /local/path/to/file.txt

服务器响应是

500 /local/path/to/file.txt: The system cannot find the path specified.

我在想自己“当然,远程主机不知道我的本地文件系统。”我的预感是我正在打开一个套接字,指定一个远程文件名,我仍然需要管理数据。但我在搜索文件中没有找到任何结论。

上传文件的完整原始ftp命令是什么?在什么时候,以及如何实际开始向远程服务器发送数据?我可以使用从ftp_connect()设置的连接作为套接字吗?

1 个答案:

答案 0 :(得分:2)

工作解决方案(使用PORT完全重写早期解决方案)。正确的顺序是

PASV
Server responds with something like
"227 Entering Passive Mode (127,0,0,1,30,235)"
STOR /path/on/remote/server/foo.txt
=> Now we have to connect to socket 30*256+235 on 127.0.0.1 and send the data.
Done

代码

$fp = ftp_connect("127.0.0.1", 21, 10) or die("foo");
ftp_login ($fp, "anonymous", "password");
ftp_raw_send_file($fp, "/local/path/to/file.txt", "foo/foo.txt");


function ftp_raw_send_file($fp, $localfile, $remotefile) {

  $connect = ftp_raw($fp, "PASV");

  // parse the response and build the IP and port from the values
  if (count($connect) > 0 && preg_match("/.*\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)/", $connect[0], $m)) {
    $address="{$m[1]}.{$m[2]}.{$m[3]}.{$m[4]}";
    $port=$m[5] * 256 + $m[6];

    print_r(ftp_raw($fp, "STOR $remotefile"));

    $sock = socket_create(AF_INET, SOCK_STREAM, 0);
    if ($sock) {
      socket_connect($sock, $address, $port);
      socket_write($sock, file_get_contents($localfile));
      socket_close($sock);
    }
  }

}