【问题标题】:PHP: download any file from ftp-server to harddrive?PHP:从 ftp 服务器下载任何文件到硬盘?
【发布时间】:2011-03-17 18:03:48
【问题描述】:

我真的很需要你的帮助。我已成功建立与我的 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 并将下载的文件提供给它,所以它没有损坏。

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

【问题讨论】:

    标签: php ftp download


    【解决方案1】:

    尝试先在本地保存,然后再推送回浏览器。

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

    <?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(...); 线。之后它就正常工作了。

    【讨论】:

    • 什么意思?当地情况如何?
    • 看起来原始代码已经在本地(或尝试)保存在 tmp 文件夹中。
    • 是的,没错!这就是为什么我没有得到它!不要在本地保存它。如果我现在对用户的本地路径一无所知,我应该在哪里保存文件。我只想从我的服务器上列出我的文件,然后单击将它们下载到他们的硬盘上。没有其他的。我想从服务器上的文件中获取正确的标题并传递它们。我想知道为什么我的连接设置成功但 ftp_get 返回“有问题”。可能是因为我不知道如何将它保存到临时文件中。
    • 只是为了确保使用 ftp_get() 一切正常。他的例子中似乎有很多评论。
    • 确保 /tmp 存在于运行 php 的服务器上
    【解决方案2】:

    tempnam()

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

    您可以将pathinfo()regexprename() 结合使用来实现此目的,您已经对文件进行了ftp。

    模仿类型

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

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

    ftp

    您尚未显示您的连接代码(所以我假设),但您需要从 FTP 提取的文件的完整路径。如果ftp_get() 步骤失败,您可能请求的文件无效。

    否则,您必须在连接并登录后ftp_chdir(),以便您位于正确的远程文件夹中。

    代码

    这段代码对我有用:

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

    【讨论】:

    • 我是否必须在我的服务器上创建一个 /tmp 目录才能工作。在哪里?
    【解决方案3】:

    这对我有用:

    $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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多