Python上传文件至SharePoint报400错误,请求排查代码问题
报错信息
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()
关键修改说明
- 修正服务器相对URL:在原路径前添加
/sites/<site_folder>/,符合SharePoint对服务器相对URL的格式要求;同时修正3.PAYMENTS Operations为3. PAYMENTS Operations(补全点后的空格),和实际目标目录命名一致。 - 提取文件名:通过
os.path.basename(temp_file)获取仅文件名,避免将本地临时路径传给SharePoint导致错误。
内容的提问来源于stack exchange,提问作者Rupesh
相关产品推荐
相关产品推荐

