我需要从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()
设置的连接作为套接字吗?
答案 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);
}
}
}