PHP:从ftp-server下载任何文件到harddrive?

时间:2010-07-19 04:59:37

标签: php ftp download

我真的需要你的帮助。我成功建立了与我的ftp服务器的连接。但是我无法弄清楚如何从我的服务器下载动态文件。我想这可以帮助很多其他人,因为我无法在网络上的任何地方找到教程或解释。

我只是在ftp上列出我的所有文件。如果我点击一个我调用download.php再次连接到服务器,应该将文件下载到我的硬盘。我能够自动提示下载窗口,文件下载到我的硬盘。但是只有一个损坏的文件没有设置标题。

/* path to files on ftp server … e.g. /folder/folder/name_of_file.jpg */
$p_arr = explode("/", $path);
/* the file name … e.g name_of_file.jpg */
$file = end($p_arr);

//$finfo = finfo_open(FILEINFO_MIME_TYPE); //returns a fatal error - function not found 
//$mimetype = finfo_file($finfo, $file);
//finfo_close($finfo);

//filetype($file)

/* creating a temporyry file to save to */
$tempFile = tempnam("/tmp", "FOO");

if(ftp_get($conn_id, $tempFile, $file, FTP_BINARY)){ 
    /*header Content-type: must be dynamic*/
    //header('Content-type:' . $mimetype);

    /*header to auto_prompt download window*/
    header('Content-Disposition: attachment; filename="'. $file .'"');
    readfile($tempFile);
} else { 
    echo "There was a problem <br>";
    echo $file . "<br>"; //e.g. image.jpg
}

/* deleting the file after the process */
//unlink($tempFile);

1。)我无法弄清楚为什么ftp_get返回false。建立连接,文件存在于正确的目录中。 2.)我不知道如何找到服务器上文件的mimetype并给它下载的文件,所以它没有损坏。

请帮帮我,我真的被卡住了。提前谢谢你

3 个答案:

答案 0 :(得分:4)

首先尝试在本地保存,然后将其推回浏览器。

使用该代码在本地保存文件。

<?php
                // define some variables
        $folder_path = "YOUR FOLDER PATH";
        $local_file = "LOCAL FILE PATH";
        $server_file = "SERVER FILE PATH";

        //-- Connection Settings
        $ftp_server = "IP ADDRESS"; // Address of FTP server.
        $ftp_user_name = "USERNAME"; // Username
        $ftp_user_pass = "PASSWORD"; // Password
        #$destination_file = "FILEPATH";

        // set up basic connection
        $conn_id = ftp_connect($ftp_server);

        // login with username and password
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

        // try to download $server_file and save to $local_file
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
            echo "Successfully written to $local_file\n";
        } else {
            echo "There was a problem\n";
        }

        // close the connection
        ftp_close($conn_id);
?>

我也发现了这个,也许它可以帮到你

  

我的FTP服务器总是响应   “bool(false)”而不是介绍我   目录列表。我不得不补充一下   ftp_pasv($ conn_id,true);之后   $ login_result = ftp_login(...);   线。之后,它运作良好。

答案 1 :(得分:0)

的tempnam()

当我使用tempnam()时,它将文件扩展名更改为.tmp。这可能会导致问题,因此我不建议这样做。至少,您应该将扩展名更改回原始文件名中的内容。

您可以使用pathinfo()regexprename() 结合使用文件来实现此目的。

的mimetype

关于mimetype:如果您希望浏览器显示您发送给用户的文件,则只需要此信息。对于下载,浏览器只需要知道它是二进制文件,浏览器或用户可以从扩展名猜测。

如果您仍想检查mimetype,则必须等到文件在服务器上,因此mime检查代码将进入if(ftp_get())块。

FTP

你没有显示你的连接代码(所以我假设),但你需要完整路径来处理你从FTP中提取的文件。如果ftp_get()步骤失败,您可能正在请求无效文件。

否则,在连接并登录后,您必须ftp_chdir() ,这样您才能进入正确的远程文件夹。

此代码对我有用:

<?php
$ftp = ftp_connect('server');
ftp_login($ftp, 'username', 'password');
$file = '/media.banzaimonkey.net/images/forums/boasas_banner_07.gif';

$tempFile = tempnam("/tmp", "FOO");

if(ftp_get($ftp, $tempFile, $file, FTP_BINARY)){
    echo 'success!';
} else {
    echo 'ffffail';
}
?>

如果该代码不适合您,则可能会遇到权限,配置或其他一些特定于环境的问题。

答案 2 :(得分:0)

这对我有用:

$fname = "file.xxx";

$conn = ftp_connect(FTP_URL);
if(ftp_login($conn, FTP_USER, FTP_PWD))
{
    if(ftp_chdir($conn, FTP_DIR))
    {
        $th = fopen('php://temp', 'r+');
        if(ftp_fget($conn, $th, $fname, FTP_ASCII, 0))
        {
            rewind($th);
            $data = stream_get_contents($th);
        }
    }
}

header("Content-Disposition: attachment; filename=$fname");
echo $data;

这样您就不必先在本地保存文件