ftplib и pyftpdlib: команда REST (перезапуск) не работает должным образом при загрузке файла на сервер

Я настроил простой FTP-сервер с pyftpdlib и клиент с ftplib. Когда я запускаю клиентский скрипт, он загружает файл правильно, как и ожидалось.

pyftpdlib Код сервера:

import logging
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
from pyftpdlib.authorizers import DummyAuthorizer

authorizer = DummyAuthorizer()
authorizer.add_user("test","123","C:\\Users\\Usr\\Desktop\\server_data","elradfmwM")
handler = FTPHandler
handler.authorizer = authorizer
logging.basicConfig(level=logging.DEBUG)
connection = ("localhost", 8080)
ftpd = FTPServer(connection, handler)
ftpd.serve_forever()

Клиентский код ftplib #1:

import ftplib

ftp = ftplib.FTP()
ftp.connect("localhost",8080)
ftp.login("test","123")

block_size = 128
c_dir = "C:\\Users\\Usr\\Desktop\\client_data"
filename = "test.pdf" # ~ 30Mb

ftp.dir()
myfile = open(c_dir + "\\" + filename , "rb")

ftp.storbinary("STOR " + filename, myfile, blocksize=block_size)

ftp.dir()
ftp.close()

Теперь я хотел проверить REST (возобновить загрузку / выгрузку с определенной позиции) функциональность. Поэтому я прервал код клиента во время загрузки (просто закрыв командную строку во время загрузки). Затем, пока сервер еще работал, я запустил следующий клиентский код в попытке возобновить загрузку с прерванной позиции:

Клиентский код ftplib #2:

import ftplib

ftp = ftplib.FTP()
ftp.connect("localhost",8080)
ftp.login("test","123")

block_size = 128
c_dir = "C:\\Users\\Usr\\Desktop\\client_data"
filename = "test.pdf" # ~ 30Mb

ftp.dir()
myfile = open(c_dir + "\\" + filename , "rb")

ftp.voidcmd('TYPE I')
rest_pos = ftp.size(filename)
print(rest_pos)
ftp.storbinary("STOR " + filename, myfile, blocksize=block_size, rest=rest_pos)

ftp.dir()
ftp.close()

Когда я запускаю код клиента № 2, он загружается, но кажется, что он не начинается с правильной позиции.

Размер файла составляет ок. 30 Мб

Код клиента № 1 загружается правильно (около 30 Мб)

Клиентский код № 2 загружается, но файл больше и поврежден (около 35 МБ)

Я сравнил вывод rest_pos с размером файла под Windows после прерывания, и они совпадают. Итак, позиция rest я перехожу к ftp.storbinary такой же как под виндой.

Я довольно новичок в Python и FTP и не могу понять, в чем проблема. Погуглил, но не смог найти ничего похожего.

Любые советы / подсказки будут оценены:)

1 ответ

Решение

Я думаю, что сделал глупую ошибку. В случае, если кто-то еще сталкивается с тем же, я должен был добавить myfile.seek(rest_pos,0) в коде клиента № 2, чтобы начать чтение файла для отправки на определенную позицию. Так должно выглядеть так:

import ftplib

ftp = ftplib.FTP()
ftp.connect("localhost",8080)
ftp.login("test","123")

block_size = 128
c_dir = "C:\\Users\\Usr\\Desktop\\client_data"
filename = "test.pdf" # ~ 30Mb

ftp.dir()
myfile = open(c_dir + "\\" + filename , "rb")

ftp.voidcmd('TYPE I')
rest_pos = ftp.size(filename)
print(rest_pos)

myfile.seek(rest_pos,0)

ftp.storbinary("STOR " + filename, myfile, blocksize=block_size, rest=rest_pos)

ftp.dir()
ftp.close()
Другие вопросы по тегам