我正在尝试编写一个PHP页面,该页面采用GET变量,该变量是FTP中的文件名并下载它。但是,它似乎不起作用。函数本身(ftp_get)在运行echo语句时返回TRUE,但是没有其他事情发生,并且控制台中没有错误。
<?php
$file = $_GET['file'];
$ftp_server = "127.0.0.1";
$ftp_user_name = "user";
$ftp_user_pass = "pass";
// set up a connection or die
$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
if (ftp_get($conn_id, $file, $file, FTP_BINARY)) {
echo "Successfully written to $file\n";
} else {
echo "There was a problem\n";
}
?>
理想情况下,我只需将它们链接到:ftp://example.com/TestFile.txt并为它们下载文件,但是,它只会在浏览器中显示文件内容而不是下载文件。
我已经浏览了PHP手册网站,阅读了FTP功能,我相信ftp_get是我想要使用的正确的。
是否有更简单的方法可以做到这一点,还是只是我忽视的东西?
答案 0 :(得分:2)
有两种(或许更多)方法可以做到这一点。您可以像在ftp_get中一样在服务器上存储文件的副本,然后将其发送给用户。或者你每次都可以下载它。
现在您可以使用ftp命令执行此操作,但使用readfile
的方法更快
遵循readfile
文档中的第一个示例:
// Save the file as a url
$file = "ftp://{$ftp_user_name}:{$ftp_user_pass}@{$ftp_server}" . $_GET['file'];
// Set the appropriate headers for a file transfer
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
// and send them
ob_clean();
flush();
// Send the file
readfile($file);
这将只是获取文件并将其内容转发给用户。标题将使浏览器将文件保存为下载。
你可以更进一步。假设您将此保存在一个名为script.php的文件中,该文件位于用户可通过http://example.com/ftp/
访问的目录中。如果您正在使用apache2并启用了mod_rewrite,则可以在此目录中创建一个.htaccess
文件,其中包含:
RewriteEngine On
RewriteRule ^(.*)$ script.php?file=$1 [L]
当用户导航到http://exmaple.com/ftp/README.md
时,您的script.php文件将被调用,$_GET['file']
等于/README.md
,而来自ftp://user:pass@ftp.example.com/README.md
的文件将下载< / em>在他的电脑上。