我已经设置了使用PyftPDLIB和一个带有FTPLIB的客户端的简单FTP服务器。当我让客户端脚本运行时,它会按预期正确上传文件。
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时,它确实上传了,但似乎并未以正确的位置启动。
文件大小为CA。30 MB
客户端代码#1正确上传(CA 30MB)
客户端代码#2上传,但文件更大且损坏(CA 35MB)
我已经将rest_pos
的输出与中断后的Windows下的文件大小进行了比较,并且确实匹配。因此,我要传递给ftp.storbinary
的位置rest
与Windows下的位置相同。
我是Python和FTP的新手,无法弄清楚问题是什么。谷歌搜索,但找不到类似的东西。
任何提示/提示都将不胜感激:)
我想我犯了一个愚蠢的错误。如果其他人遇到相同的情况,我必须在客户端代码2中添加myfile.seek(rest_pos,0)
才能开始读取要在特定位置发送的文件。所以看起来应该这样:
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()