0

正如标题所说,我可以访问上传一些文件的共享文件夹。我只想下载一个名为“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))

有没有办法下载这个文件?

4

1 回答 1

0

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

Dropbox API v2 Python SDK中,这就是方法sharing_get_shared_link_filesharing_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”。确保使用实际正确的那个。)

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

于 2022-02-24T21:58:20.027 回答