如何修改PHP FTP上载脚本以下载文件

如何修改PHP FTP上载脚本以下载文件,php,ftp,Php,Ftp,我找到了一个用于传输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_use

我找到了一个用于传输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);
$fp=fopen($local_文件,'r');
$conn\u id=ftp\u connect($source\u ftp\u server);
$login\u result=ftp\u login($conn\u id、$source\u ftp\u user\u name、$source\u ftp\u user\u pass);
$ret=ftp\u nb\u fput($conn\u id,$remote\u file,$fp,ftp\u二进制文件);
而($ret==FTP\u MOREDATA){
//建立到FTP服务器的新连接
如果(!isset($conn_id2)){
$conn_id2=ftp_connect($source_ftp_server);
$login\u result2=ftp\u login($conn\u id2,$source\u ftp\u user\u name,$source\u ftp\u user\u pass);
}
//检索上载文件的大小。
if(isset($conn_id2)){
clearstatcache();//0){
$i=($remote_file_size/$local_file_size)*100;
printf(“%d%%上传
”,$i); 冲洗(); } $ret=ftp\u nb\u continue($conn\u id); } 如果($ret!=FTP\u完成){ echo“上传文件时出错…
”; 出口(1); } 否则{ echo“
文件已成功上载!

”; } fclose($fp);
我去掉了一些不重要的部分,比如脚本中的附加信息等等

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

我真的很想使用与上面相同的代码,带有进度指示器等,但不确定如何修改此代码以下载文件而不是上载文件

它可能是一对夫妇的简单变化是所有需要的

这段代码中有没有特别需要更改的部分,或者这段代码在下载时的效果与在上传时的效果不一样

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

它是否像将ftp_nb_fput命令更改为ftp_nb_get命令一样简单?我并不完全理解这些代码,因此很难判断需要更改什么


谢谢您的帮助。

您正在寻找
ftp\u 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);

以下是脚本,经过必要的修改,可以下载文件:

   $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);
$fp=fopen($local_file2,'w+');
$conn\u id=ftp\u connect($source\u ftp\u server);
$login\u result=ftp\u login($conn\u id、$source\u ftp\u user\u name、$source\u ftp\u user\u pass);
$ret=ftp\u nb\u fget($conn\u id,$fp,$remote\u file2,ftp\u二进制文件);
而($ret==FTP\u MOREDATA){
//建立到FTP服务器的新连接
如果(!isset($conn_id2)){
$conn_id2=ftp_connect($source_ftp_server);
$login\u result2=ftp\u login($conn\u id2,$source\u ftp\u user\u name,$source\u ftp\u user\u pass);
}
//检索源文件的大小。
if(isset($conn_id2)){
clearstatcache();//0){
$i=($local\u file2\u size/$remote\u file2\u size)*100;
printf(“%d%%下载
”,$i); } $ret=ftp\u nb\u continue($conn\u id); } 如果($ret!=FTP\u完成){ echo“下载文件时出错…
”; 出口(1); } echo“
文件已成功下载!

”; fclose($fp);
虽然我真的理解你寻求帮助的请求,但你现在应该意识到了(考虑到你的声誉),这不是为您完成工作的必要条件。这是为了帮助您编写不起作用的代码。遇到问题时,您无法根据自己尝试过的内容了解自己。因此,请尝试在web上搜索有关PHP FTP客户端的教程。从中学习并解决问题。然后,如果出现问题,您可以在此处提出问题。@SherwinFlight引用“提问,获得答案,不要分心”…你在这里并没有提出任何问题。你发布了一些与你想做的事情几乎无关的代码,并请某人为你解决所有问题。如果你完全被困在如何进行的问题上,并且明确知道你想做什么,我们可以给出一些建议。更好的是,如果你将问题缩小到一个特定的问题上,我们可以ld会提供一个很好的具体答案。相反,您发布了很多信息,但不清楚问题是什么以及我们如何帮助您。这是没有成效的。@SherwinFlight“我不太理解所有这些代码,因此很难判断需要更改什么。”在你的项目中使用代码之前,你真的应该理解它,如果只是为了确保它没有做你不想让它做的事情的话。另外,从别人帮助你的代码中赚钱并不是一件坏事。没有人(至少是体面的成员)这里会看不起你。最后,这是一项工作,谋生是完全正常的。这些是该特定函数的基本标志。如果函数返回
FTP\u FAILED
,则表示上载失败。如果它返回
FTP\u FINISHED
,则表示上载完成。如果它返回
FTP\u MOREDATA
,这意味着上传仍在进行中(因此是while循环),它返回相同的值/标志,并且具有相同的含义。感谢您提供的帮助。从我的阅读来看,ftp_get命令似乎与ftp_nb_get命令类似,只是后者是非阻塞的。我想我只需要稍微处理一下它。我的主要问题是,我假设我的虽然循环也需要修改,因为它们最初是用于文件上传的。我以前从未使用过通过PHP的FTP,所以不确定所有函数如何工作。看起来只有一种方法可以解决这个问题