0

以下は、ftp 経由でダウンロードするために使用するコードの一部です。ダウンロードを停止してから続行するか、後で再ダウンロードしようとしていました。ftp.abort() を試しましたが、ハングしてタイムアウトを返すだけです。

ftplib.error_proto: 421 Data timeout. Reconnect. Sorry.

シナリオ: シナリオは、ユーザーがダウンロードするファイルを選択し、ダウンロード中にユーザーが現在のダウンロードを停止して新しいファイルをダウンロードできるというものです。コード 'if os.path.getsize(self.file_path) >117625:' は、ユーザーがダウンロードを停止した場合の単なる例です。ファイルのフルサイズではありません。

ありがとう。

from ftplib import FTP

class ftpness:

    def __init__(self):
            self.connect(myhost, myusername, mypassword)

    def handleDownload(self,block):
        self.f.write(block)
        if os.path.getsize(self.file_path) >117625:
                self.ftp.abort()

    def connect(self,host, username, password):
        self.ftp = FTP(host)
        self.ftp.login(username, password)
        self.get(self.file_path)

    def get(self,filename):
        self.f = open(filename, 'wb')
        self.ftp.retrbinary('RETR ' + filename, self.handleDownload)
        self.f.close()
        self.ftp.close

a = ftpness()
4

3 に答える 3

0

ウォッチドッグタイマーを使用してこれを行う方法は次のとおりです。これには、別のスレッドの作成が含まれますが、アプリケーションの設計によっては受け入れられない場合があります。

ユーザーイベントでダウンロードを強制終了するのも同じ考えです。GUIが別のスレッドで機能する場合、そのスレッドはFTPインスタンス内に到達し、そのソケットを直接閉じることができます。

from threading import Timer

class ftpness:
    ...

    def connect(self,host, username, password):
        self.ftp = FTP(host)
        self.ftp.login(username, password)
        watchdog = Timer(self.timeout, self.ftp.sock.close)
        watchdog.start()
        self.get(self.file_path)
        watchdog.cancel()  # if file transfer succeeds cancel timer

このように、ファイル転送が事前設定されたタイムアウトより長く実行された場合、タイマースレッドは転送の下のソケットを閉じ、get呼び出しに例外を発生させます。転送が成功した場合にのみ、ウォッチドッグタイマーがキャンセルされます。

これはあなたの質問とは何の関係もありませんが、通常、connect呼び出しはペイロードデータを転送するべきではありません。

于 2012-04-09T15:07:03.973 に答える
0

エラー 421 は標準タイムアウト エラーです。そのため、ファイルがダウンロードされるまで接続が必要です。

 def handleDownload(self,block):
        self.f.write(block)
        if os.path.getsize(self.file_path) >117625:
                self.ftp.abort() 
        else:
                self.ftp.sendcmd('NOOP')
#try to add this line just to keep the connection alive.

これがあなたを助けることを願っています。:)

于 2012-04-09T13:21:34.613 に答える
0

これはあなたのセッションのアイドル時間が長すぎます。大統領の後にインスタンス化 ftplib にファイルできます。さもないと。ftp ソフトウェア構成を変更します。

たとえば、vsftpd を使用する場合、次の構成を vsftpd.conf に追加できます。

idle_session_timeout=60000 # The default is 600 seconds

于 2013-09-17T11:10:05.597 に答える