【问题标题】:How to modify PHP FTP upload script to download files instead如何修改 PHP FTP 上传脚本以下载文件
【发布时间】:2015-10-24 01:03:20
【问题描述】:

我找到了一个用于传输 FTP 文件的 PHP 脚本,它的工作原理完全符合我项目的一部分的需要。该脚本可以通过FTP将文件上传到另一台服务器,并且可以随时输出进度。

我使用的代码是:

   $fp = fopen($local_file, 'r');
   $conn_id = ftp_connect($source_ftp_server);
   $login_result = ftp_login($conn_id, $source_ftp_user_name, $source_ftp_user_pass);
   $ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY);
   while ($ret == FTP_MOREDATA) {
       // Establish a new connection to FTP server
       if(!isset($conn_id2)) {
           $conn_id2 = ftp_connect($source_ftp_server);
           $login_result2 = ftp_login($conn_id2, $source_ftp_user_name, $source_ftp_user_pass);
       }

       // Retreive size of uploaded file.
       if(isset($conn_id2)) {
           clearstatcache(); // <- this must be included!!
           $remote_file_size = ftp_size($conn_id2, $remote_file);
       }

       // Calculate upload progress
       $local_file_size  = filesize($local_file);
       if (isset($remote_file_size) && $remote_file_size > 0 ){
           $i = ($remote_file_size/$local_file_size)*100;
                   printf("%d%% uploaded<br>", $i);
                   flush();

       }
       $ret = ftp_nb_continue($conn_id);

   }


   if ($ret != FTP_FINISHED) {
       echo "<span style='color:red;'><b>There was an error uploading the file...</b></span><br>";
       exit(1);
   }
    else {
        echo "<br>Files successfully uploaded!<br><br>";    
    }

   fclose($fp);

我去掉了一些不重要的部分,比如脚本回显的额外信息等。

此代码非常适合将文件上传到其他服务器。但是,我还需要使用 FTP 从服务器下载文件。

我真的很想使用与上面相同的代码,以及进度指示器等,但不知道如何修改此代码以下载文件而不是上传文件。

可能只需要几个简单的更改。

此代码中是否有任何部分需要特别更改,或者这对下载的工作方式与对上传的工作方式不同?

如果有人能指出一些正确的方向来解决这个问题,我将不胜感激。

是否像将 ftp_nb_fput 命令更改为 ftp_nb_get 命令一样简单?我并不真正了解所有这些代码,因此很难说出需要更改的内容。

感谢您的帮助。

【问题讨论】:

  • 虽然我真的理解您寻求帮助的需求,但您现在应该意识到(考虑到您的声誉),SO 不适合为您完成工作。 SO 是帮助您处理不起作用的代码。遇到问题,您无法在尝试过的事情上弄清楚自己。所以尝试在网上搜索有关 PHP FTP 客户端的教程。从中学习并解决问题。然后,如果出现问题,您可以在这里提出问题。
  • @SherwinFlight 正如您所引用的那样,“提出问题,获得答案,不要分心”......您在这里并没有真正提出问题。您发布了一些与您想要做的几乎无关的代码,并要求某人为您解决所有问题。如果您完全不知道如何进行,并且明确知道您想做什么,我们可以提供指点。更好的是,如果您将问题缩小到一个特定的问题,我们可以提供一个很好的具体答案。相反,您发布了很多信息,但不清楚问题是什么以及我们如何为您提供帮助。这没有效率。
  • @SherwinFlight “我并不真正了解所有这些代码,因此很难说出需要更改的内容。”在你的项目中使用它之前,你真的应该理解代码,如果只是为了确保它没有做你不希望它做的事情。
  • 另外,从人们在 SO 上帮助你的代码中赚钱并不是一件坏事。这里没有人(至少是体面的成员)会因此而看不起你。归根结底,这是一份工作,以它为生是完全正常的。
  • 这些基本上是该特定功能的标志。如果函数返回FTP_FAILED,则表示上传失败。如果返回FTP_FINISHED,则表示上传完成。如果它返回FTP_MOREDATA,这意味着上传仍在进行中(因此是while循环)。现在如果你看一下php.net/manual/en/function.ftp-nb-get.php(下载函数),它返回相同的值/标志并且也具有相同的含义。

标签: php ftp


【解决方案1】:

您正在寻找ftp_get

看起来应该像下面这样使用:

$conn_id = ftp_connect($source_ftp_server);

$login_result = ftp_login($conn_id, $source_ftp_user_name, $source_ftp_user_pass);

$success = ftp_get($conn_id, $local_file, $server_file, FTP_BINARY);

http://php.net/manual/en/function.ftp-get.php

【讨论】:

  • 感谢您提供帮助。从我读到的内容看来 ftp_get 命令类似于 ftp_nb_get 命令,只是后者是非阻塞的。我只是想玩一下它。我的主要事情是我假设我的 While 循环中的其他函数也需要修改,因为它们最初是用于文件上传的。我以前从来没有通过 PHP 使用过 FTP,所以不太确定这些功能是如何工作的。看起来只有一种方法可以解决这个问题......不过感谢您的帮助,非常感谢。
【解决方案2】:

这是脚本,进行了必要的修改以使其下载文件:

   $fp = fopen($local_file2, 'w+');
   $conn_id = ftp_connect($source_ftp_server);
   $login_result = ftp_login($conn_id, $source_ftp_user_name, $source_ftp_user_pass);
   $ret = ftp_nb_fget($conn_id, $fp, $remote_file2, FTP_BINARY);
   while ($ret == FTP_MOREDATA) {
       // Establish a new connection to FTP server
       if(!isset($conn_id2)) {
           $conn_id2 = ftp_connect($source_ftp_server);
           $login_result2 = ftp_login($conn_id2, $source_ftp_user_name, $source_ftp_user_pass);
       }

       // Retreive size of source file.
       if(isset($conn_id2)) {
           clearstatcache(); // <- this must be included!!
           $remote_file2_size = ftp_size($conn_id2, $remote_file2);
       }

       // Calculate download progress
       $local_file2_size  = filesize($local_file2);
       if (isset($remote_file2_size) && $remote_file2_size > 0 ){
           $i = ($local_file2_size/$remote_file2_size)*100;
                   printf("%d%% downloaded<br>", $i);

       }
       $ret = ftp_nb_continue($conn_id);

   }

   if ($ret != FTP_FINISHED) {
       echo "<span style='color:red;'><b>There was an error downloading the file...</b></span><br>";
       exit(1);
   }
echo "<br>Files successfully downloaded!<br><br>";

   fclose($fp);

【讨论】:

  • 干得好。 +1 让您自己投入时间和精力!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
相关资源
最近更新 更多