ftplib和pyftpdlib:将文件上传到服务器时,REST(重新启动)命令无法正常工作

时间:2017-03-05 03:34:07

标签: python ftp ftplib pyftpdlib

我已经设置了一个带有pyftpdlib的简单FTP服务器和一个带有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时,它会上传,但似乎它没有从正确的位置开始。

文件大小为ca. 30 Mb

客户端代码#1正确上传(约30Mb)

客户端代码#2上传但文件较大且已损坏(约35Mb)

我在中断后将rest_pos的输出与Windows下的文件大小进行了比较,并且它们匹配。因此,我传递给rest的位置ftp.storbinary与Windows下的相同。

我是python和ftp的新手,无法弄清问题是什么。谷歌搜索,但找不到任何类似的东西。

任何提示/提示都将不胜感激:)

1 个答案:

答案 0 :(得分:2)

我想我犯了一个愚蠢的错误。如果其他人遇到相同的情况,我必须在客户端代码#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()