You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 15:57:26