运行脚本时无法从FTP服务器自动下载文件

时间:2013-08-07 16:37:03

标签: php javascript html ftp

我正在尝试编写一个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是我想要使用的正确的。

是否有更简单的方法可以做到这一点,还是只是我忽视的东西?

1 个答案:

答案 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>在他的电脑上。