使用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
相关产品推荐
相关产品推荐

