python中的可恢复文件上载

python中的可恢复文件上载,python,python-2.7,resume-upload,Python,Python 2.7,Resume Upload,我正在尝试用python上传文件,我想以可恢复模式上传文件,即当internet连接恢复时,文件上传将从上一阶段恢复 是否有支持可恢复文件上载的特定协议 提前感谢因此,您需要的是查找文件并发送REST命令,告诉服务器从正确的位置下载 下面是一段代码,该代码将一直尝试直到它完成与resume的上载,并且debug处于启用状态,以便您可以执行以下操作: #!/usr/bin/env python3 import ftplib import os import sys import time impo

我正在尝试用python上传文件,我想以可恢复模式上传文件,即当internet连接恢复时,文件上传将从上一阶段恢复

是否有支持可恢复文件上载的特定协议


提前感谢

因此,您需要的是查找文件并发送REST命令,告诉服务器从正确的位置下载

下面是一段代码,该代码将一直尝试直到它完成与resume的上载,并且debug处于启用状态,以便您可以执行以下操作:

#!/usr/bin/env python3
import ftplib
import os
import sys
import time
import socket

class FtpUploadTracker:
    sizeWritten = 0
    totalSize = 0.0
    lastShownPercent = 0

    def __init__(self, totalSize):
        self.totalSize = totalSize

    def handle(self, block):
        self.sizeWritten += 1024
        percentComplete = round((self.sizeWritten / self.totalSize) * 100)

        if (self.lastShownPercent != percentComplete):
            self.lastShownPercent = percentComplete
            print(str(percentComplete) + "% complete ramaing: " + str(self.totalSize - self.sizeWritten), flush=True)



if __name__ == "__main__":
    Server="servername.com"
    Username="username"
    Password="secret password"
    filename = "/path/to/folder"
    Directory="/path/on/server"

    tries = 0
    done = False

    print("Uploading " + str(filename) + " to " + str(Directory), flush=True)

    while tries < 50 and not done:
        try:
            tries += 1
            with ftplib.FTP(Server) as ftp:
                ftp.set_debuglevel(2)
                print("login", flush=True)
                ftp.login(Username, Password)
                # ftp.set_pasv(False)
                ftp.cwd(Directory)
                with open(filename, 'rb') as f:
                    totalSize = os.path.getsize(filename)
                    print('Total file size : ' + str(round(totalSize / 1024 / 1024 ,1)) + ' Mb', flush=True)
                    uploadTracker = FtpUploadTracker(int(totalSize))

                    # Get file size if exists
                    files_list = ftp.nlst()
                    print(files_list, flush=True)
                    if os.path.basename(filename) in files_list:
                        print("Resuming", flush=True)
                        ftp.voidcmd('TYPE I')
                        rest_pos = ftp.size(os.path.basename(filename))
                        f.seek(rest_pos, 0)
                        print("seek to " + str(rest_pos))
                        uploadTracker.sizeWritten = rest_pos
                        print(ftp.storbinary('STOR ' + os.path.basename(filename), f, blocksize=1024, callback=uploadTracker.handle, rest=rest_pos), flush=True)
                    else:
                        print(ftp.storbinary('STOR ' + os.path.basename(filename), f, 1024, uploadTracker.handle), flush=True)
                        done = True

        except (BrokenPipeError, ftplib.error_temp, socket.gaierror) as e:
            print(str(type(e)) + ": " + str(e))
            print("connection died, trying again")
            time.sleep(30)


    print("Done")
它有
rest=rest\u pos

如果提供了可选的rest,则会向服务器发送rest命令, 作为论据传递休息。rest通常是到 请求的文件,告诉服务器重新开始发送文件的字节 在请求的偏移量处,跳过初始字节。然而请注意 RFC959只要求rest是包含字符的字符串 可打印范围从ASCII代码33到ASCII代码126。这个 因此,transfercmd()方法将rest转换为字符串,但不转换为 将对字符串的内容执行检查。如果服务器没有 识别REST命令时,将引发错误\回复异常。 如果发生这种情况,只需调用transfercmd(),而不使用rest参数



还有一些代码

可能与Good old@AlessandroDaRugna重复-但FTP不会为可恢复的文件上载提供此类功能。我不认为facebook或谷歌使用FTP进行可恢复的文件上传。这是客户端的事情:你可以试试rsync
print(ftp.storbinary('STOR ' + os.path.basename(filename), f, blocksize=1024, callback=uploadTracker.handle, rest=rest_pos), flush=True)