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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:57:49