ftplib 和 pyftpdlib:将文件上传到服务器时,REST(重启)命令未按预期工作
ftplib and pyftpdlib : REST (restart) command not working as expected when uploading file to server
我用 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
(从特定位置重新启动 upload/download)功能。所以我在上传时中断了客户端代码(只需在上传时关闭我的命令提示符)。接下来,当服务器仍在 运行ning 时,我 运行 以下客户端代码试图从中断的位置恢复上传:
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 它确实上传了,但它似乎没有从正确的位置开始。
文件大小约为。 30MB
客户端代码 #1 正确上传(约 30Mb)
客户端代码 #2 上传,但文件较大且已损坏(约 35Mb)
我将 rest_pos
的输出与中断后 Windows 下的文件大小进行了比较,它们确实匹配。所以我传递给 ftp.storbinary
的位置 rest
与 Windows.
下的位置相同
我是 python 和 ftp 的新手,无法弄清楚问题出在哪里。谷歌搜索,但找不到任何类似的东西。
任何 tips/hints 将不胜感激 :)
我想我犯了一个愚蠢的错误。以防其他人遇到同样的情况,我不得不在客户端代码 #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()
我用 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
(从特定位置重新启动 upload/download)功能。所以我在上传时中断了客户端代码(只需在上传时关闭我的命令提示符)。接下来,当服务器仍在 运行ning 时,我 运行 以下客户端代码试图从中断的位置恢复上传:
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 它确实上传了,但它似乎没有从正确的位置开始。
文件大小约为。 30MB
客户端代码 #1 正确上传(约 30Mb)
客户端代码 #2 上传,但文件较大且已损坏(约 35Mb)
我将 rest_pos
的输出与中断后 Windows 下的文件大小进行了比较,它们确实匹配。所以我传递给 ftp.storbinary
的位置 rest
与 Windows.
我是 python 和 ftp 的新手,无法弄清楚问题出在哪里。谷歌搜索,但找不到任何类似的东西。
任何 tips/hints 将不胜感激 :)
我想我犯了一个愚蠢的错误。以防其他人遇到同样的情况,我不得不在客户端代码 #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()