ftplibでアップロードの進行状況および完了を確認する方法をご紹介します。
目次
条件
- Python 3.7.0
前提
以下の記事のソースを用いて実行します。
アップロード完了の確認
storbinary()の戻り値を確認します。
ソース
以下のように戻り値を出力した場合、アップロードが完了すると「226 Transfer complete.」という結果になります。
ftpResult = ftp.storbinary('STOR ' + FILE_NAME, f) # 対象ファイルをアップロード print('ftpResult = ' + ftpResult)
実行結果
ftpResult = 226 Transfer complete.
アップロード進行状況の確認
アップロードの進行状況を知りたい場合、storbinary()の引数にハンドラを渡します。
処理の抜粋
対象処理を抜粋すると以下のようになります。
- アップロードするファイルのトータルサイズを取得
- アップロードのトラッカークラスをインスタンス化
- storbinary()の引数にインスタンス化したトラッカークラスをハンドラとして渡す
class FtpUploadTracker: sizeWritten = 0 totalSize = 0 lastShownPercent = 0 def __init__(self, totalSize): self.totalSize = totalSize def handle(self, block): self.sizeWritten += len(block) # アップロード済みサイズに加算 percentComplete = round((self.sizeWritten / self.totalSize) * 100) if (self.lastShownPercent != percentComplete): self.lastShownPercent = percentComplete logger.debug(str(percentComplete) + " percent complete") totalSize = os.path.getsize(FILE_NAME) uploadTracker = FtpUploadTracker(int(totalSize)) ftpResult = ftp.storbinary('STOR ' + FILE_NAME, f, 8192, uploadTracker.handle) # 対象ファイルをアップロード
アップロードの進行状況および完了確認
進行状況および完了確認を組み込んだ全体ソースは以下の通りです。
ソース
from ftplib import FTP import ftplib import os.path from logging import getLogger, StreamHandler, Formatter, DEBUG ## ログ出力設定 logger = getLogger("FTP Test") logger.setLevel(DEBUG) stream_handler = StreamHandler() stream_handler.setLevel(DEBUG) formatter = Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') stream_handler.setFormatter(formatter) logger.addHandler(stream_handler) ## 接続先ホスト HOST = 'XXX.com' PORT = 21 USER = 'userName' PASSWORD = 'password' DIRECTORY = 'test' ## アップロードファイル名 FILE_NAME = 'test.jpg' ## ネットワーク設定がおかしい場合の回避策 _old_makepasv = FTP.makepasv def _new_makepasv(self): HOST, PORT = _old_makepasv(self) HOST = self.sock.getpeername()[0] return HOST, PORT FTP.makepasv = _new_makepasv class FtpUploadTracker: sizeWritten = 0 totalSize = 0 lastShownPercent = 0 def __init__(self, totalSize): self.totalSize = totalSize def handle(self, block): self.sizeWritten += len(block) # アップロード済みサイズに加算 percentComplete = round((self.sizeWritten / self.totalSize) * 100) if (self.lastShownPercent != percentComplete): self.lastShownPercent = percentComplete logger.debug(str(percentComplete) + " percent complete") ## FTP接続、ファイルアップロード logger.debug('== Start FTP ==') with FTP() as ftp: try: ftp.connect(HOST, PORT) # ホスト、ポートを指定して接続 ftp.login(USER, PASSWORD) # ユーザID、パスワードを指定してログイン ftp.cwd(DIRECTORY) # 指定のディレクトリに移動 totalSize = os.path.getsize(FILE_NAME) # アップロードするファイルのトータルサイズ logger.debug('Total file size : ' + str(round(totalSize / 1024 / 1024 ,1)) + ' Mb') uploadTracker = FtpUploadTracker(int(totalSize)) # アップロードハンドラ with open(FILE_NAME, 'rb') as f: ftpResult = ftp.storbinary('STOR ' + FILE_NAME, f, 8192, uploadTracker.handle) # 対象ファイルをアップロード logger.debug('ftpResult = ' + ftpResult) except ftplib.all_errors as e: logger.error('FTP error = %s' % e) else: logger.debug('FTP success.') logger.debug('== End FTP ==')
実行結果
2019-12-09 11:01:05,551 - FTP Test - DEBUG - == Start FTP == 2019-12-09 11:01:05,726 - FTP Test - DEBUG - Total file size : 0.3 Mb 2019-12-09 11:01:05,838 - FTP Test - DEBUG - 3 percent complete 2019-12-09 11:01:05,839 - FTP Test - DEBUG - 5 percent complete 2019-12-09 11:01:05,841 - FTP Test - DEBUG - 8 percent complete 2019-12-09 11:01:05,842 - FTP Test - DEBUG - 11 percent complete 2019-12-09 11:01:05,843 - FTP Test - DEBUG - 14 percent complete 2019-12-09 11:01:05,845 - FTP Test - DEBUG - 16 percent complete 2019-12-09 11:01:05,846 - FTP Test - DEBUG - 19 percent complete 2019-12-09 11:01:05,847 - FTP Test - DEBUG - 22 percent complete 2019-12-09 11:01:05,876 - FTP Test - DEBUG - 24 percent complete 2019-12-09 11:01:05,908 - FTP Test - DEBUG - 27 percent complete 2019-12-09 11:01:05,909 - FTP Test - DEBUG - 30 percent complete 2019-12-09 11:01:05,910 - FTP Test - DEBUG - 33 percent complete 2019-12-09 11:01:05,911 - FTP Test - DEBUG - 35 percent complete 2019-12-09 11:01:05,911 - FTP Test - DEBUG - 38 percent complete 2019-12-09 11:01:05,912 - FTP Test - DEBUG - 41 percent complete 2019-12-09 11:01:05,912 - FTP Test - DEBUG - 43 percent complete 2019-12-09 11:01:05,913 - FTP Test - DEBUG - 46 percent complete 2019-12-09 11:01:05,914 - FTP Test - DEBUG - 49 percent complete 2019-12-09 11:01:05,915 - FTP Test - DEBUG - 52 percent complete 2019-12-09 11:01:05,916 - FTP Test - DEBUG - 54 percent complete 2019-12-09 11:01:05,917 - FTP Test - DEBUG - 57 percent complete 2019-12-09 11:01:05,945 - FTP Test - DEBUG - 60 percent complete 2019-12-09 11:01:05,947 - FTP Test - DEBUG - 62 percent complete 2019-12-09 11:01:05,947 - FTP Test - DEBUG - 65 percent complete 2019-12-09 11:01:05,949 - FTP Test - DEBUG - 68 percent complete 2019-12-09 11:01:05,949 - FTP Test - DEBUG - 71 percent complete 2019-12-09 11:01:05,950 - FTP Test - DEBUG - 73 percent complete 2019-12-09 11:01:05,951 - FTP Test - DEBUG - 76 percent complete 2019-12-09 11:01:05,952 - FTP Test - DEBUG - 79 percent complete 2019-12-09 11:01:05,953 - FTP Test - DEBUG - 81 percent complete 2019-12-09 11:01:05,954 - FTP Test - DEBUG - 84 percent complete 2019-12-09 11:01:05,955 - FTP Test - DEBUG - 87 percent complete 2019-12-09 11:01:05,956 - FTP Test - DEBUG - 90 percent complete 2019-12-09 11:01:05,956 - FTP Test - DEBUG - 92 percent complete 2019-12-09 11:01:05,957 - FTP Test - DEBUG - 95 percent complete 2019-12-09 11:01:05,958 - FTP Test - DEBUG - 98 percent complete 2019-12-09 11:01:05,959 - FTP Test - DEBUG - 100 percent complete 2019-12-09 11:01:06,046 - FTP Test - DEBUG - ftpResult = 226 Transfer complete. 2019-12-09 11:01:06,047 - FTP Test - DEBUG - FTP success. 2019-12-09 11:01:06,066 - FTP Test - DEBUG - == End FTP ==
参考
stackoverflow:ftplib capture and process ftp server response code
https://stackoverflow.com/questions/30045369/ftplib-capture-and-process-ftp-server-response-code
stackoverflow:Python ftplib: Show FTP upload progress
https://stackoverflow.com/questions/21998013/python-ftplib-show-ftp-upload-progress/21998216