从 FTP 到 php:// 输出的文件下载不工作
File download from FTP to php://output doesn't work
我用 PHP 创建了一个网站,我必须从 FTP 服务器下载一个文件。
我不想把文件暂时保存在网络服务器上,所以我把它保存在PHP缓冲区中。但是当我下载它时,缓冲区显然是空的,因为文件名匹配但文件是空的。
这是我的代码
ob_start();
ftp_chdir($conn_id, $_REQUEST["path"]);
ftp_get($conn_id, "php://output", $_REQUEST["remoteFile"], FTP_BINARY);
$data = ob_get_contents();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='. $_REQUEST["remoteFile"]);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($data));
echo $data;
ob_end_clean();
exit;
例如,当我尝试下载一个之前正确上传的txt文件时,文件名没问题,但内容是空的。
在您调用 echo $data;
时,输出缓冲仍处于打开状态。因此,您将数据(第二次)写回输出缓冲区。然后你清除它。所以什么都没有输出。
只需还原 echo $data;
和 ob_end_clean();
调用:
ob_end_clean();
echo $data;
尽管更简单的方法是执行以下操作:
$data = file_get_contents("ftp://username:password@ftp.example.com/path/file.dat");
header(...);
echo $data;
假设 ftp:// protocol wrappers 已启用。
而且你不需要任何缓冲。而且你也不会在任何时候在内存中两次拥有该文件。
我用 PHP 创建了一个网站,我必须从 FTP 服务器下载一个文件。
我不想把文件暂时保存在网络服务器上,所以我把它保存在PHP缓冲区中。但是当我下载它时,缓冲区显然是空的,因为文件名匹配但文件是空的。
这是我的代码
ob_start();
ftp_chdir($conn_id, $_REQUEST["path"]);
ftp_get($conn_id, "php://output", $_REQUEST["remoteFile"], FTP_BINARY);
$data = ob_get_contents();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='. $_REQUEST["remoteFile"]);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . strlen($data));
echo $data;
ob_end_clean();
exit;
例如,当我尝试下载一个之前正确上传的txt文件时,文件名没问题,但内容是空的。
在您调用 echo $data;
时,输出缓冲仍处于打开状态。因此,您将数据(第二次)写回输出缓冲区。然后你清除它。所以什么都没有输出。
只需还原 echo $data;
和 ob_end_clean();
调用:
ob_end_clean();
echo $data;
尽管更简单的方法是执行以下操作:
$data = file_get_contents("ftp://username:password@ftp.example.com/path/file.dat");
header(...);
echo $data;
假设 ftp:// protocol wrappers 已启用。
而且你不需要任何缓冲。而且你也不会在任何时候在内存中两次拥有该文件。