ftplibでアップロードの進行状況および完了を確認する方法

ftplibでアップロードの進行状況および完了を確認する方法をご紹介します。

条件

  • Python 3.7.0

前提

以下の記事のソースを用いて実行します。

PythonでFTPアップロードを行う方法

アップロード完了の確認

storbinary()の戻り値を確認します。

ソース

以下のように戻り値を出力した場合、アップロードが完了すると「226 Transfer complete.」という結果になります。

ftpResult = ftp.storbinary('STOR ' + FILE_NAME, f) # 対象ファイルをアップロード
print('ftpResult = ' + ftpResult)

実行結果

ftpResult = 226 Transfer complete.

アップロード進行状況の確認

アップロードの進行状況を知りたい場合、storbinary()の引数にハンドラを渡します。

処理の抜粋

対象処理を抜粋すると以下のようになります。

  1. アップロードするファイルのトータルサイズを取得
  2. アップロードのトラッカークラスをインスタンス化
  3. 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

Python:ftplib — FTPプロトコルクライアント

https://docs.python.org/ja/3/library/ftplib.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です