我有以下问题:
我需要连接到FTP并读取一个CSV文件。密码的主要问题是@,$,%...如何连接特殊字符?我尝试了以下连接方式:
文件打开
$filename = 'ftp://user:p@s([email protected]/file.csv';
$handle = fopen($filename, "r") or die("Error");
FTP登录
$ftp_server = "ftp.myftp.url/file.csv";
$ftp_user = "user";
$ftp_pass = "p@s($word";
$conn_id = ftp_connect($ftp_server) or die("Could not connect to $ftp_server");
$login_result = ftp_login($ftp_server, $ftp_user, $ftp_pass) or die("Could not connect to 2");
$data = file_get_contents('ftp.myftp.url/file.csv');
谢谢大家!
您的两段代码有两个明显的问题。
文件打开
$filename = 'ftp://user:p@s([email protected]/file.csv'; $handle = fopen($filename, "r") or die("Error");
在这里,问题是@
,正如你已经正确猜到的那样,因为它在URL syntax中有意义(作为凭证和主机名之间的分隔符)。
你必须URL-encode @
到%40
:
$filename = 'ftp://user:p%40s([email protected]/file.csv';
你提到实际密码也有%
。这必须是URL-encoded到%25
。
FTP登录
$ftp_server = "ftp.myftp.url/file.csv"; $ftp_user = "user"; $ftp_pass = "p@s($word"; $conn_id = ftp_connect($ftp_server) or die("Could not connect to $ftp_server"); $login_result = ftp_login($ftp_server, $ftp_user, $ftp_pass) or die("Could not connect to 2");
在这里,问题不是@
,因为没有涉及到URL(%
都不是问题)。在这里,问题是$
,因为你是using double-quotes, so $word
is replaced with a value of (probably undefined) variable word
,有效地使密码只有p@s(
。
使用single quotes来避免将$
解释为变量:
$ftp_pass = 'p@s($word';
或者用$
逃离\
:
$ftp_pass = "p@s(\$word";
您应该替换@(at)char的十六进制值。试试这个,
@ -> %40,
$ -> %24
$ftp_pass = "p%40s(%24word";