【问题标题】:How can I resume an upload to ftp from php如何恢复从 php 上传到 ftp
【发布时间】:2010-01-19 07:03:09
【问题描述】:

我有一个 php 脚本,可以将文件从带宽非常低、连接可靠性低的位置上传到 ftp 服务器。我目前正在使用ftp functions of php

有时连接会在传输过程中断开。有没有办法稍后恢复上传?如何做到这一点?

编辑: 人们误解了这是从浏览器中发生的。然而,这种情况并非如此。它是一个 php cli 脚本。所以它是关于一个本地文件被上传到 ftp,没有用户交互。

【问题讨论】:

    标签: php ftp


    【解决方案1】:

    尝试获取远程文件的大小,然后发出带有差异的 APPE ftp 命令。这将附加到文件中。有关示例,请参阅http://webmasterworld.com/forum88/4703.htm。如果你想真正控制它,我建议使用 PHP 的 cURL 函数。

    【讨论】:

    • 你的链接坏了,但这个想法确实是我需要的。如果您修复您的链接,我会很高兴地投票...
    【解决方案2】:

    我认为之前的所有答案都是错误的。 PHP 管理简历,因为必须激活 FTP_AUTODESK,并且您必须在上传期间激活 FTP_AUTORESUME。代码应该是这样的:

    $ftp_connect = ftp_connect($host, $port);
    ftp_set_option ($ftp_connect, FTP_AUTOSEEK, TRUE);
    $stream = fopen($local_file, 'r');
    $upload = ftp_fput($ftp_connect, $file_on_ftp, $stream, FTP_BINARY, FTP_AUTORESUME);
    fclose($stream);
    

    【讨论】:

    • 抱歉 5 年的颠簸,但您确定 FTP_AUTORESUME 参数位于 ftp_put() 参数列表的末尾吗?该参数位置应该用于查找位置(整数)。查看文档(实际上说得很少),我认为正确的用法是在调用 ftp_fput()...之前发出 ftp_set_option($ftp_connect,FTP_AUTORESUME,true)...?
    【解决方案3】:

    ftp_(f)put 有一个 $startpos 参数。您应该能够使用此参数执行所需的操作。 (从您服务器上的文件大小开始传输)。 但是我从来没有使用过它,所以我不知道可靠性。你应该试试。

    【讨论】:

    • 这个 $startpos 参数记录在哪里?它真的是从客户端和远程文件的那个字节开始的吗?
    • 如果这个答案可以扩展,我可以更改我接受的答案并投票!
    【解决方案4】:

    编辑: Another Example: by cballou

    Look here。一个非常简单又很好的例子。

    你可以这样做:

    <?php
         $host = 'your.host.name';
         $user = 'user';
         $passwd = 'yourpasswd';
    
    
         $ftp_stream = ftp_connect($host);
         //EDIT
         ftp_set_option($ftp_stream, FTP_AUTOSEEK, 1);
         if ( ftp_login($ftp_stream,$user,$passwd) ){
            //activate passive mode
            //ftp_pasv($ftp_stream, TRUE);
    
            $ret = ftp_nb_put($ftp_stream, $remotefile, $localfile, FTP_BINARY,FTP_AUTORESUME);
            while ( FTP_MOREDATA == $ret ) {
                // continue transfer
                $ret = ftp_nb_continue($ftp_stream);
            }
    
            if (FTP_FINISHED !== $ret){
               echo 'Failure occured on transfer ...';
            } 
         }
         else {
             print "FAILURE while login ...";
    
         }
    
         //free
         ftp_close($ftp_stream);
    ?>
    

    【讨论】:

    • 您确定 FTP_AUTORESUME 参数位于 ftp_nb_put() 参数列表的末尾吗?该参数位置应该用于查找位置(整数)。查看文档(实际上说得很少),我认为正确的用法是在调用 ftp_nb_put()...之前发出ftp_set_option($ftp_connect,FTP_AUTORESUME,true)...?
    • 我这里只参考 PHP.net php.net/manual/en/function.ftp-nb-put.php#example-4831php.net/manual/en/ftp.constants.php#constant.ftp-autoresume 的文档。是的,你在这个地方是对的,我忘记了ftp_set_option ($ftp_stream, FTP_AUTOSEEK, true);
    • FTP_AUTORESUME (integer) Automatically determine resume position and start position for GET and PUT requests (only works if FTP_AUTOSEEK is enabled)
    【解决方案5】:

    您的意思是您将允许用户从您的网络界面上传简历吗? 这适合你吗? http://www.webmasterworld.com/php/3931706.htm

    【讨论】:

    • 请下次正确发短信,但不要浪费时间和别人的功劳!!对于任何让您感到不舒服的文字,我们深表歉意...
    • 浪费别人的时间?在我最初的问题中,我已经清楚地谈论了使用 ftp 函数从 php 上传。我不知道你从哪里得到它与 Web 界面有任何关系的想法。你浪费时间不是我的错。
    【解决方案6】:

    只需使用 filezilla 就可以为您完成一切...我的意思是上传过程... 它将保留数据并在关闭后重新打开您将能够继续处理 q...

    对于自动化和跟踪,只需使用我们的方式...即 git 和 capistrano php有一个选项 试试谷歌吧……

    【讨论】:

    • 您尚未阅读该问题。他需要以编程方式执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多