使用Graph API上传文件至SharePoint失败:资源未找到
解决方案
1. 修正请求方法与URL格式
Graph API中,通过:/{filename}:/content路径上传文件时,必须使用PUT请求,而非POST。POST请求不适用于该端点的文件上传场景。同时,Content-Type需匹配文件实际类型(比如xlsx文件对应application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,而非text/plain)。
修正后的上传代码:
file_name = "Reporte Z.xlsx" upload_url = f"{site_url}/{site_id}/drives/{drive_id}/root:/{file_name}:/content" headers = { "Authorization": f"Bearer {access_token}", "Connection": "Keep-alive", # 匹配xlsx文件的正确Content-Type "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" } with open(file_path, "rb") as file: file_content = file.read() # 替换POST为PUT请求 response = requests.put(upload_url, headers=headers, data=file_content) if response.status_code == 201: print("文件上传成功") else: print("上传文件出错:", response.status_code, response.text)
2. 排查额外问题点
- 文件名编码:若文件名含空格、非ASCII字符,需进行URL编码避免路径解析错误:
import urllib.parse encoded_file_name = urllib.parse.quote(file_name) upload_url = f"{site_url}/{site_id}/drives/{drive_id}/root:/{encoded_file_name}:/content" - 权限验证:确认
access_token拥有Files.ReadWrite或Sites.ReadWrite.All权限——读取权限仅能访问文件,写入操作需要额外的写入权限。 - Drive正确性:检查
drive_id是否对应目标文档库,部分Site可能包含多个Drive,避免选错上传目标。
3. 备选上传方案(通过/children端点)
如果上述方法仍无效,可通过/root/children端点分步上传:
upload_url = f"{site_url}/{site_id}/drives/{drive_id}/root/children" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # 先创建文件元数据 file_metadata = { "name": file_name, "file": {} } # 创建空文件并获取上传会话 response = requests.post(upload_url, headers=headers, json=file_metadata) if response.status_code == 201: # 构造上传会话URL upload_session_url = response.json()["@microsoft.graph.downloadUrl"].replace("download", "upload") # 上传文件内容 upload_response = requests.put(upload_session_url, headers={"Authorization": f"Bearer {access_token}"}, data=file_content) if upload_response.status_code == 200: print("文件上传成功") else: print("上传内容出错:", upload_response.status_code, upload_response.text) else: print("创建文件元数据出错:", response.status_code, response.text)
错误根源说明
- 使用POST请求访问
:/{filename}:/content端点时,Graph API无法识别该操作,因此返回404(该端点仅支持PUT进行文件上传)。 - 移除冒号后URL变为
root/{file_name}/content,不符合API路径规范,API会判定为实体属性修改请求,因此要求JSON格式的Content-Type,导致报错。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

