Python ftplib 和 storbinary

3 投票
1 回答
16589 浏览
提问于 2025-04-16 11:57

我在尝试理解 ftplib 是怎么工作的。

我想把一个文件保存到 FTP 服务器上,并实现一个回调功能。

文档上说:

FTP.storbinary(command, file[, blocksize, callback, rest])

callback 函数的定义在文档里是这样的:

每当接收到一块数据时,都会调用这个回调函数,传入一个字符串参数,表示这块数据。

我该怎么实现这个回调呢?在 retrbinary(读取文件)上的一个示例回调可能看起来像这样:

def handle(block):
    f.write(block)
    print ".", 

这个回调会显示文件下载的进度,f 是文件对象。

但是我不知道怎么在 storbinary(上传文件)中实现这个功能。

有没有什么建议可以做到这一点?我知道有 block 参数,但我该怎么调整它来进行上传呢?

更新:

我已经为上传准备了一个回调,如下:

def handle(block):
    f.read(block)
    print ".",

但正如预期的那样,它给出了错误:

an integer is required

传入 int(block) 也不行。

1 个回答

5

如果你的回调函数是这样的:

def handle(block):
    f.write(block)
    print ".", 

在Python中,函数可以像普通变量一样使用,可以作为参数传递——这就是回调函数的意思——你把这个函数作为参数传给storbinary调用。

ftp.storbinary(command="stor someFileNameOnServer", file=open("localFile",'rb'), callback=handle,blocksize=1024)

根据Python的文档,

回调函数是一个可选的单参数可调用对象,它会在每块数据发送后被调用。

这纯粹是一个后处理的方法,比如用来显示传输状态,它会在每块数据发送后被调用。上面的例子中,它会在每发送1024字节的数据后被调用。

要实现传输状态,可以像这样做:

sizeWritten = 0
totalSize = someMethodToGetTotalBytesInFile()
def handle(block):
    global sizeWritten
    sizeWritten += 1024
    percentComplete = sizeWritten / totalSize
    print "%s percent complete" %str(sizeWritten / totalSize)

os.path.getsize可以给你文件的总大小(以字节为单位)。

撰写回答