首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ftplib和pyftpdlib :将文件上传到服务器时,REST (重新启动)命令无法正常工作

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

Stack Overflow用户
提问于 2017-03-05 11:34:07
回答 1查看 1.2K关注 0票数 0

我已经使用pyftpdlib设置了一个简单的FTP服务器,并使用ftplib设置了一个客户端。当我让客户端脚本运行时,它会按照预期正确地上载文件。

pyftpdlib服务器代码:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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上传正确(ca 30Mb)

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

我将rest_pos的输出与中断后Windows下的文件大小进行了比较,它们确实是匹配的。所以我传递给ftp.storbinary的位置rest和Windows下的是一样的。

我是python和ftp的新手,不知道问题出在哪里。我搜索过了,但找不到任何类似的东西。

如有任何提示/提示,我们将不胜感激:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-05 20:26:40

我想我犯了一个愚蠢的错误。如果其他人遇到同样的情况,我不得不在客户机代码#2中添加myfile.seek(rest_pos,0),以开始读取要在特定位置发送的文件。所以它应该看起来像这样:

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42604218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档