使用Microsoft Graph API从OneDrive文件夹内下载文件失败求助
解决OneDrive Graph API下载文件夹内文件报itemNotFound的问题
我帮你定位到问题啦!你能正常下载根目录文件,但子文件夹里的文件下载失败,核心原因是你对整个API URL做了URL编码,而不是只编码文件路径部分,导致Graph API没法正确识别你要访问的文件位置。
问题出在哪
看你代码里这一行:
OneDrive_FileURL = urllib.parse.quote(OneDrive_FileURL, safe=':/')
你把包括域名、路由在内的整个URL都编码了,虽然设置了safe=':/'保留了关键符号,但路径里的空格被转成%20后,Graph API的路径解析逻辑会混乱——它需要的是/root:/{编码后的文件路径}:/content这种结构,而不是整个URL都被编码后的格式。
怎么修复
只对文件路径部分单独编码,再拼进API URL里就行。修改后的代码如下:
import sys, os, time, requests import pandas as pd import urllib.parse # 先编码文件路径,处理空格和特殊字符 encoded_file_path = urllib.parse.quote('New Folder/Knox EARNSTSALV2020.xlsx') # 拼接成正确的Graph API URL OneDrive_FileURL = f'https://graph.microsoft.com/v1.0/me/drive/root:/{encoded_file_path}:/content' print(OneDrive_FileURL) Client_Id = 'XXXX' Tenant_Id = 'YYYYY' Refresh_Token_First = 'ZZZZZ' PostStr = {'grant_type': 'refresh_token', 'client_id': Client_Id, 'refresh_token': Refresh_Token_First} Token_Response = requests.post(f'https://login.microsoftonline.com/{Tenant_Id}/oauth2/v2.0/token', data=PostStr) Access_Token = Token_Response.json()['access_token'] New_Refresh_Token = Token_Response.json()['refresh_token'] if Access_Token is None or New_Refresh_Token is None: print('\n> Failed: Access_Token NOT Retrieved') sys.exit() Response = requests.get(OneDrive_FileURL, headers={'Authorization': 'Bearer ' + Access_Token}) if Response.status_code == 200: print('\n> Response Success') with open('Excel File.xlsx', 'wb') as File: File.write(Response.content) print('\n> File Downloaded') else: print('\n> Failed:', Response.status_code) print(Response.content)
额外小提示
- 虽然你能下载根目录文件,权限应该没问题,但可以确认下你的应用是否有
Files.Read权限(这是下载文件的基础权限)。 - 以后遇到文件名/文件夹名带空格、特殊字符的情况,记得只编码路径部分,别碰API的固定路由结构哦~
内容的提问来源于stack exchange,提问作者question.it
相关产品推荐
相关产品推荐

