在 Python 中使用 next_chunk() 上传 Google 驱动器 API v3 上传的错误查看状态的解释?

Explaination on error viewing status of Google Drive API v3 upload using next_chunk() in Python?

我正在尝试使用 v3 api 向 google 驱动器进行可恢复的上传。我希望能够显示上传的状态栏。如果我不需要状态栏,我可以轻松快速地上传它,因为我可以使用 .execute() 函数并上传。当我想分块上传文件时,问题就出现了。我在这里和其他地方看到了一些解决方案,但它们似乎不起作用。

这是我的上传代码:

    CHUNK_SIZE = 256*1024
    file_metadata = {'name': file_name, 'parents': [folder_id]} #Metadata for the file we are going to upload
    media = MediaFileUpload(file_path, mimetype='application/zip',chunksize=CHUNK_SIZE, resumable=True) 
    file = service.files().create(body=file_metadata, media_body=media, fields='id')
    progress = progressBarUpload(file) #create instance off progress bar class
    progress.exec_() #execute it
    progress.hide() #hide it off the screen after
    print(file_name + " uploaded successfully")
    return 1 #returns 1 if it was successful

进度条为我的 gui 调用一个线程,然后使用 next_chunk() 函数,代码在这里:

signal = pyqtSignal(int)
def __init__(self, file):
    super(ThreadUpload,self).__init__()
    self.file = file

def run(self):
    done = False
    while done == False:
        status, done = self.file.next_chunk()
        print("status->",status)
        if status:
            value = int(status.progress() * 100)
            print("Uploaded",value,"%")
            self.signal.emit(value)

我遇到的问题是我的状态 = None.

如果我使用此代码,它可以正常工作,但我无法使用此方法查看上传状态。添加了一个 .execute() 使其工作。这样做时我摆脱了 next_chunk() 部分:

    CHUNK_SIZE = 256*1024
    file_metadata = {'name': file_name, 'parents': [folder_id]} #Metadata for the file we are going to upload
    media = MediaFileUpload(file_path, mimetype='application/zip',chunksize=CHUNK_SIZE, resumable=True) 
    file = service.files().create(body=file_metadata, media_body=media, fields='id').execute()

无论我是否在进度条线程中使用,第一种方法都不起作用,第二种方法每次都有效。我使用进度条来查看下载状态和其他一些东西,它工作得很好,所以我非常有信心这是我的状态 = None 下载时的问题。

提前感谢您的帮助。

问题是您将请求的响应(在您的情况下为 done 变量)与 False 进行比较,这种情况永远不会 return True 因为上传过程完成后,响应是 None 或具有对象 ID 的对象。这是我测试并成功运行的代码:

   CHUNK_SIZE = 256 * 1024
    file_metadata = {'name': "Test resumable"}  # Metadata for the file we are going to upload
    media = MediaFileUpload("test-image.jpg", mimetype='image/jpeg', chunksize=CHUNK_SIZE, resumable=True)
    request = service.files().create(body=file_metadata, media_body=media, fields='id')
    response = None
    while response is None:
        status, response = request.next_chunk()
        if status:
            print(status.progress())

    print(response)
    print("uploaded successfully")

对于您的情况,您可以更改这两行:

done = False
while done == False:

为此:

done = None
while done is None: