Python - загрузка папки zip в Dropbox через APIv2 не удается - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь загрузить папку zip в Dropbox. Zip - это резервная копия с произвольным именем в соответствии с текущей датой и временем. Папка правильно заархивирована, названа и сохранена. К сожалению, всегда есть проблема с загрузкой в ​​Dropbox. Я проверил readme.txt, используя тот же код, который работает. Я не понимаю, где это идет не так. Спасибо за любую помощь.

import dropbox
import os
import datetime

dt = ('{:%Y%m%d_%H%M}'.format(datetime.datetime.now()))
name = dt + "_pa.zip"

os.system("zip -r " + name +  " /home/obliss")

class TransferData:
    def __init__(self, access_token):
        self.access_token = access_token
    def upload_file(self, file_from, file_to):
        dbx = dropbox.Dropbox(self.access_token)
        with open(file_from, 'rb') as f:
            dbx.files_upload(f.read(), file_to, mode=dropbox.files.WriteMode.overwrite)

access_token = "[hidden]"
file_from = "/home/olbliss/"+name
file_to = "/Work/Python Anywhere Backups/"+name
transferData = TransferData(access_token)

try:
    transferData.upload_file(file_from, file_to)
except:
    os.remove(name)
    print('uploaded failed, '+name+' removed from /home/olbliss/')

try:
    os.remove(name)
except:
    pass

Сообщение об ошибке: enter image description here

1 Ответ

0 голосов
/ 12 марта 2020

Код состояния 413 указывает на то, что полезная нагрузка была слишком большой. Метод files_upload официально поддерживает только файлы размером до 150 МБ. Вам нужно будет использовать upload_sessions для больших файлов.

Вот базовый пример c, который использует Dropbox Python SDK для загрузки файла в Dropbox API из локального файла, указанного file_path, к удаленному пути, указанному dest_path. Он также выбирает, использовать ли сеанс загрузки на основе размера файла:

f = open(file_path)
file_size = os.path.getsize(file_path)

CHUNK_SIZE = 8 * 1024 * 1024

if file_size <= CHUNK_SIZE:

    print dbx.files_upload(f.read(), dest_path)

else:

    upload_session_start_result = dbx.files_upload_session_start(f.read(CHUNK_SIZE))
    cursor = dropbox.files.UploadSessionCursor(session_id=upload_session_start_result.session_id,
                                               offset=f.tell())
    commit = dropbox.files.CommitInfo(path=dest_path)

    while f.tell() <= file_size:
        if ((file_size - f.tell()) <= CHUNK_SIZE):
            print dbx.files_upload_session_finish(f.read(CHUNK_SIZE),
                                            cursor,
                                            commit)
            break
        else:
            dbx.files_upload_session_append_v2(f.read(CHUNK_SIZE),
                                            cursor)
            cursor.offset = f.tell()

f.close()

Примечание: это должно служить только примером. Он не был тщательно протестирован и не поддерживает обработку ошибок.

...