关于在Python中使用next_chunk()进行Google Drive API v3上传的错误查看状态的解释?

问题描述 投票:0回答:1

我正在尝试使用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)

我遇到的问题是我的状态=无。

如果我使用此代码,它将正常工作,但是我无法使用此方法查看上传状态。有一个.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()

不管我是否在进度条线程中使用它,第一种方法都不起作用,第二种方法每次都可以同时使用。我使用进度条查看下载状态和其他一些内容,并且效果很好,因此我很确信它的事实是我的状态=无(下载时就是问题)。

非常感谢您的帮助。

python python-3.x upload google-drive-api
1个回答
0
投票

[问题是,您正在将请求的响应(在您的情况下为done变量)与False进行比较,此条件将永远不会返回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:
© www.soinside.com 2019 - 2024. All rights reserved.