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()