使用Office365-REST-Python-Client移动SharePoint文件失败,求参数格式
环境:Python 3.10,Office365-REST-Python-Client==2.4.1
尝试编写代码移动SharePoint文件,代码如下:
def get_file(ctx: ClientContext, name: str) -> File: result = None try: file: File = ctx.web.get_file_by_server_relative_url(name) ctx.load(file) ctx.execute_query() result = file except ClientRequestException as e: print(e) finally: return result file_from: File = get_file(ctx, file_to_move) file_from.moveto(folder_to, True) ctx.execute_query()
已确认文件有效且获取到唯一ID,已知File.moveto方法调用签名要求第一个参数为{"newurl": new_relative_url,"flags": flag},尝试三种路径参数均触发错误:
- 目标目录路径:
Documents/.../inventory/error(目录已存在) - 带文件名的路径:
Documents/.../inventory/error/name(希望重命名为name) - 包含sites前缀的路径:
sites/...Documents/.../inventory/error/name
错误信息:
('-1, Microsoft.SharePoint.Client.InvalidClientQueryException', 'Input string was not in a correct format.', "400 Client Error:
请问File.moveto方法的第一个参数和第二个参数应采用何种正确格式?
正确参数格式说明
第一个参数要求
必须传入字典格式,键为newUrl(注意SDK要求驼峰命名),值为包含完整文件名的服务器相对URL:
- URL需以站点为基准,开头带斜杠,格式示例:
/sites/你的站点名称/Documents/目标目录/目标文件名.ext - 无论是否需要重命名,都必须包含文件名,不能只传目录路径
- 不能省略开头的斜杠,否则会被视为相对当前文件的路径,触发格式错误
第二个参数要求
不能传入布尔值,必须使用MoveOperations枚举值(需提前导入),常用枚举值:
MoveOperations.Overwrite:覆盖目标位置的同名文件MoveOperations.AllowBrokenThickets:允许移动包含文档集或关联文件的内容- 可通过位或
|组合多个枚举值
修正后的代码示例
from office365.sharepoint.client_context import ClientContext from office365.sharepoint.files.file import File from office365.runtime.client_request_exception import ClientRequestException from office365.sharepoint.files.move_operations import MoveOperations def get_file(ctx: ClientContext, name: str) -> File: result = None try: file: File = ctx.web.get_file_by_server_relative_url(name) ctx.load(file) ctx.execute_query() result = file except ClientRequestException as e: print(e) finally: return result # 示例:源文件路径(服务器相对URL) file_to_move = "/sites/你的站点名/Documents/源目录/原文件名.ext" # 示例:目标完整路径(服务器相对URL,包含新文件名) target_full_url = "/sites/你的站点名/Documents/.../inventory/error/新文件名.ext" file_from: File = get_file(ctx, file_to_move) # 调用moveto,传入字典和枚举值 file_from.moveto({"newUrl": target_full_url}, MoveOperations.Overwrite) ctx.execute_query()
注意事项
- 确保目标目录已存在,否则会报错
- 服务器相对URL的站点名称、文档库名称(比如Documents)必须和实际环境一致
- 若不需要重命名,目标文件名需和源文件名保持一致
内容的提问来源于stack exchange,提问作者reza
相关产品推荐
相关产品推荐

