当文件路径和文件名中有“空格”时使用ftp_get()

时间:2014-08-27 02:33:12

标签: php csv ftp filesystems

我需要通过PHP ftp_get()下载文件,但是愚蠢的提供者正在使用包含空格的目录和文件名。我正在处理的文件路径类似于/product info/more stuff/inventory and stuff.csv

路径和文件名本身的空间使得难以检索任何内容。我已经尝试了以下但没有成功:

  1. $path = "/product\ info/more\ stuff/inventory\ and\ stuff.csv";

  2. $path = "/product%20info/more%20stuff/inventory%20and%20stuff.csv";

  3. $path = '"/product info/more stuff/inventory and stuff.csv"';

  4. 再次感谢您花时间帮助我。

2 个答案:

答案 0 :(得分:5)

FTP?

您的第三次尝试,引用完整路径,已经是推荐的方法。虽然它在很大程度上取决于实际的服务器实现。

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_nlistftp_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)

获取路径中包含空格的文件或文件夹列表。

ftp_chdir($conn, $path);

$children = ftp_rawlist($conn,'-a .');

Source