从共享 Dropbox 文件夹下载单个文件,无需该文件的共享链接

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

如标题所示,我可以访问共享文件夹,其中上传了一些文件。我只想下载一个名为“db.dta”的特定文件。所以,我有这个脚本:

def download_file(url, filename):
    url = url
    file_name = filename
    with open(file_name, "wb") as f:
        print("Downloading %s" % file_name)
        response = requests.get(url, stream=True)
        total_length = response.headers.get('content-length')

        if total_length is None: # no content length header
            f.write(response.content)
        else:
            dl = 0
            total_length = int(total_length)
            for data in response.iter_content(chunk_size=4096):
                dl += len(data)
                f.write(data)
                done = int(50 * dl / total_length)
                sys.stdout.write("\r[%s%s]" % ('=' * done, ' ' * (50-done)) )    
                sys.stdout.flush()
    print(" ")
    print('Descarga existosa.')

如果我将 dl=0 修改为 1,它实际上会下载文件的共享链接,如下所示:

https://www.dropbox.com/s/ajklhfalsdfl/db_test.dta?dl=1

问题是,我在这个共享文件夹中没有这个特定文件的共享链接,所以如果我使用文件预览的 url,我会收到拒绝访问的错误(即使我将 dl=0 更改为 1)。

https://www.dropbox.com/sh/a630ksuyrtw33yo/LKExc-MKDKIIWJMLKFJ?dl=1&preview=db.dta

给出的错误:

dropbox.exceptions.ApiError: ApiError('22eaf5ee05614d2d9726b948f59a9ec7', GetSharedLinkFileError('shared_link_access_denied', None))

有办法下载这个文件吗?

python dropbox dropbox-api dropbox-sdk
1个回答
1
投票

如果您有父文件夹的共享链接,而不是所需的特定文件,则可以使用 /2/sharing/get_shared_link_file 端点 仅下载特定文件。

Dropbox API v2 Python SDK 中,这就是

sharing_get_shared_link_file
方法(或
sharing_get_shared_link_file_to_file
)。根据您共享的错误输出,您似乎已经在使用它(尽管不在您发布的特定代码片段中)。

使用它看起来像这样:

import dropbox

dbx = dropbox.Dropbox(ACCESS_TOKEN)

folder_shared_link = "https://www.dropbox.com/sh/a630ksuyrtw33yo/LKExc-MKDKIIWJMLKFJ"
file_relative_path = "/db.dat"

res = dbx.sharing_get_shared_link_file(url=folder_shared_link, path=file_relative_path)

print("Metadata: %s" % res[0])
print("File data: %s bytes" % len(res[1].content))

(您在问题中提到了“db.dat”和“db.dta”。确保您使用实际正确的那个。)

此外,请注意,如果您使用的是通过“应用程序文件夹”访问类型注册的 Dropbox API 应用程序:当前存在一个错误,当将此方法与应用程序文件夹应用程序的访问令牌一起使用时,可能会导致此

shared_link_access_denied
错误。


更新:当对具有应用程序文件夹访问类型的应用程序使用访问令牌时,/2/sharing/get_shared_link_metadata 和 /2/sharing/get_shared_link_file 端点(以及 SDK 中的相应方法)现在应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.