我需要通过PHP ftp_get()
下载文件,但是愚蠢的提供者正在使用包含空格的目录和文件名。我正在处理的文件路径类似于/product info/more stuff/inventory and stuff.csv
路径和文件名本身的空间使得难以检索任何内容。我已经尝试了以下但没有成功:
$path = "/product\ info/more\ stuff/inventory\ and\ stuff.csv";
$path = "/product%20info/more%20stuff/inventory%20and%20stuff.csv";
$path = '"/product info/more stuff/inventory and stuff.csv"';
再次感谢您花时间帮助我。
答案 0 :(得分:5)
您的第三次尝试,引用完整路径,已经是推荐的方法。虽然它在很大程度上取决于实际的服务器实现。
FTP per RFC859由终端会话和数据传输通道组成。基本上FTP服务器在命令端口上提供了一个mini-shell。因此,典型的shell字符串转义规则确实适用。这里可以排除URL编码。
我建议先使用单引号。最好使用escapeshellarg()
来应用它们。并在此时尝试ftp_nb_get()
。
$path = "/foo foo/bar bar/baz baz.csv";
ftp_nb_get($con, "save.csv", escapeshellarg($path), 2);
如果不起作用,则需要进一步调试。虽然所有ftp_ *函数参数are left unprocessed,您也可以尝试发送ftp_raw
请求。这实际上不会激活数据通道读取,但可能会返回更具体的错误响应。
print_r(ftp_raw($con, "RETR '/path to/some file.csv'\r\n"));
我只是要说,如果你仍然得到一个文件未找到错误那么;完全有可能该文件确实不存在于假定的位置。在这种情况下,手动遍历目录结构ftp_nlist
和ftp_rawlist
var_dump
(如果子目录有额外的尾随空格)。
或者只使用PHPs ftp:// stream wrapper(也支持PASV模式)。其实现与ext / ftp函数的实现不同。有趣的是,URL编码再次是正确的方法,但引用仍然是必要的(ftp_fopen_wrapper.c不引用自己):
= file_get_contents("ftp://user:pw@example.org/'path%20to/file%20and.csv'");
// Inline quotes may likely trip up some FTP server implementations..
更好的选择是使用cURL
。
// You'll have to use the long-winded PHP curl functions of course.
print curl("ftp://.../file with spaces.csv")->exec();
最后一个选项只是调用Unixland客户端。 (如果不是wget,则比普通的ftp客户端。)
$url = escapeshellarg("ftp://user:pw@ftp.example.org/$path");
$file = `wget $url`;
如果仍然无法检索任何文件,则必须在PHP中查找备用FTP客户端以进行进一步调试。猜猜who wrote one。
答案 1 :(得分:1)