Nik*_*son 1 php csv filesystems ftp
我需要通过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"';
再次感谢您抽出宝贵时间来帮助我。

您的第三次尝试(引用完整路径)已经是推荐的方法。虽然这在很大程度上取决于实际的服务器实现。
根据RFC859的FTP由一个终端会话和一个数据传输通道组成。基本上,FTP服务器在命令端口上提供了一个微型外壳。因此,确实适用典型的shell字符串转义规则。可以在此处排除URL编码。
我建议先使用单引号。最好使用escapeshellarg()它们。并尝试ftp_nb_get()一下。
$path = "/foo foo/bar bar/baz baz.csv";
ftp_nb_get($con, "save.csv", escapeshellarg($path), 2);
Run Code Online (Sandbox Code Playgroud)
如果这样不起作用,则需要进一步调试。当所有ftp_ *函数参数都未处理时,您也可以尝试发送ftp_raw请求。这实际上不会激活数据通道的读取,但可能会返回更具体的错误响应。
print_r(ftp_raw($con, "RETR '/path to/some file.csv'\r\n"));
Run Code Online (Sandbox Code Playgroud)
我要说的是,如果您仍然遇到找不到文件的错误,那么;很有可能该文件确实不在假定的位置。在这种情况下手动遍历目录结构ftp_nlist和ftp_rawlist与var_dump(在额外尾部空格的情况下,对于子目录)。
或者,仅使用PHP ftp://流包装器(也支持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..
Run Code Online (Sandbox Code Playgroud)
一个更好的替代方法是使用cURL。
// You'll have to use the long-winded PHP curl functions of course.
print curl("ftp://.../file with spaces.csv")->exec();
Run Code Online (Sandbox Code Playgroud)
最后一个选择就是求助于Unixland客户程序。(如果不是wget,则不是普通的ftp客户端。)
$url = escapeshellarg("ftp://user:pw@ftp.example.org/$path");
$file = `wget $url`;
Run Code Online (Sandbox Code Playgroud)
如果仍然无法检索任何文件,则必须在PHP中寻找其他FTP客户端以进行进一步的调试。猜猜谁写了一个。
| 归档时间: |
|
| 查看次数: |
4027 次 |
| 最近记录: |