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

Python上传文件至SharePoint报400错误,请求排查代码问题

问题:Python上传文件到SharePoint报错「Server relative urls must start with SPWeb.ServerRelativeUrl」

报错信息

office365.runtime.client_request_exception.ClientRequestException: ('-2147024809, System.ArgumentException', 'Server relative urls must start with SPWeb.ServerRelativeUrl', "400 Client Error: Bad Request for url: https://<company_name>.sharepoint.com/sites/<site_folder>/_api/Web/getFolderByServerRelativeUrl('Shared%20Documents%2FGeneral%2F3.%20PAYMENTS%20Operations%2FTIES%2FCRS%20Report%20files')/Files/add(overwrite=true,url='%2Ftmp%2Ftmp1lsc2asr%2FXML_REPORT_df185e51-2df0-48be-ad7f-cf8a3ae31914.xml')")

目标上传目录

SharePoint目录结构:Shared Documents > General > 3. PAYMENTS Operations > TIES > CRS Report files

原代码片段

full_url = f'https://<company_name>.sharepoint.com/sites/<site_folder>/'
relative_url = f'Shared Documents/General/3.PAYMENTS Operations/TIES/CRS Report files'
ctx = get_sharepoint_context_using_user()

print(ctx)

target_folder = ctx.web.get_folder_by_server_relative_url(relative_url)

print(target_folder)

# Open file in binary mode
with open(temp_file, 'rb') as content_file:
    file_content = content_file.read()
    #print(file_content)
    target_folder.upload_file(temp_file, file_content).execute_query()

问题分析与修复方案

问题1:服务器相对URL格式不符合要求

报错明确提示服务器相对URL必须以SPWeb.ServerRelativeUrl开头,也就是要包含站点的相对路径前缀(/sites/<site_folder>/)。同时原代码中3.PAYMENTS Operations少了点后面的空格,和实际目标目录的命名不匹配。

问题2:上传时传入了完整临时文件路径而非文件名

upload_file方法的第一个参数应该是要在SharePoint中保存的文件名,而非本地临时文件的完整路径(比如/tmp/tmp1lsc2asr/XML_REPORT_xxx.xml),否则SharePoint会把整个路径当作文件名处理,触发路径格式错误。


修正后的代码

import os

full_url = f'https://<company_name>.sharepoint.com/sites/<site_folder>/'
# 修正服务器相对URL:添加站点前缀,补全空格
relative_url = f'/sites/<site_folder>/Shared Documents/General/3. PAYMENTS Operations/TIES/CRS Report files'
ctx = get_sharepoint_context_using_user()

target_folder = ctx.web.get_folder_by_server_relative_url(relative_url)

# 提取本地临时文件的文件名,而非完整路径
file_name = os.path.basename(temp_file)

# 读取文件并上传
with open(temp_file, 'rb') as content_file:
    file_content = content_file.read()
    target_folder.upload_file(file_name, file_content).execute_query()

关键修改说明

  1. 修正服务器相对URL:在原路径前添加/sites/<site_folder>/,符合SharePoint对服务器相对URL的格式要求;同时修正3.PAYMENTS Operations为3. PAYMENTS Operations(补全点后的空格),和实际目标目录命名一致。
  2. 提取文件名:通过os.path.basename(temp_file)获取仅文件名,避免将本地临时路径传给SharePoint导致错误。

内容的提问来源于stack exchange,提问作者Rupesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:11:19