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

使用Python调用Office 365 API上传时忽略文件锁定问题

问题概述

我在公司流水线中构建了一个模块,支持用户通过配置在指定SharePoint企业文件夹中上传/下载文件。当前上传环节遇到问题:当目标文件被其他用户打开时,上传同名文件会触发ClientRequestException,错误信息如下:

"name": "ClientRequestException",
"message": "('-2147018894, Microsoft.SharePoint.SPFileLockException', \"Die Datei '<site_name>/<site_folder>/<file_name>' ist für die gemeinsame Verwendung durch '<email> [membership]' gesperrt.\", \"423 Client Error: Locked for url: https://<site_name>/_api/Web/getFolderByServerRelativeUrl(<file-info>)"

尝试过先删除现有文件再上传,但这种方式会将文件版本重置为1.0,不符合需求。需要找到无需重置版本即可忽略文件锁定完成上传的方法。

解决方案

核心思路是直接覆盖目标文件,同时通过请求头Prefer: bypass-shared-lock绕过SharePoint的共享锁,既保留文件版本历史,又能在文件被锁定时完成上传。

修改后的代码示例:

from office365.runtime.auth.user_credential import UserCredential
from office365.sharepoint.client_context import ClientContext

def add_bypass_lock_header(request):
    request.headers['Prefer'] = 'bypass-shared-lock'

# 初始化客户端上下文
credentials = UserCredential(SP_USER, SP_PW)
ctx = ClientContext("<sharepoint-site>").with_credentials(credentials)

# 获取目标文件夹
target_folder = ctx.web.get_folder_by_server_relative_url("<sharepoint-folder>")

# 读取本地文件内容
with open("<file-name>", 'rb') as lf:
    file_content = lf.read()

# 绑定请求头到上传操作
ctx.before_execute(add_bypass_lock_header)
# 执行上传(覆盖现有文件,保留版本历史)
target_folder.upload_file("<file-name>", file_content, overwrite=True).execute_query()
关键说明
  • 请求头Prefer: bypass-shared-lock:该请求头会告知SharePoint忽略当前的共享协作锁,允许直接覆盖文件。
  • overwrite=True参数:确保上传时直接覆盖现有文件,而非创建新文件或抛出存在性错误,SharePoint会自动生成新的版本记录,不会重置版本号。
  • 避免删除文件操作:删除后重新上传会断裂版本链,直接覆盖是保留完整版本历史的正确方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:55:32