如何用Python调用SharePoint API上传文件并配置公共访问权限
一、API选择:优先用Microsoft Graph API
相比SharePoint REST API,Graph API是微软官方推荐的统一云服务接口,覆盖所有Office 365服务场景,支持更简洁的权限配置和文件操作,尤其是公共链接的创建逻辑更标准化,后续维护成本更低。
二、最佳认证方式:OAuth 2.0 客户端凭证流
适合无用户交互的后台服务场景,是SharePoint Online服务端集成的推荐方案。需要先在Azure AD完成以下配置:
- 注册一个应用程序,获取租户ID、客户端ID、客户端密钥
- 给应用添加应用权限:
Files.ReadWrite.All、Sites.ReadWrite.All,并完成管理员授权
三、完整代码实现
使用微软官方的msgraph-sdk-python库,简化API调用流程:
1. 安装依赖
pip install msgraph-sdk python-dotenv
2. 代码示例
import os from dotenv import load_dotenv from msgraph import GraphServiceClient from azure.identity import ClientSecretCredential from msgraph.generated.models.share_link_type import ShareLinkType from msgraph.generated.models.link_type import LinkType from msgraph.generated.models.permission import Permission # 加载环境变量(敏感信息存.env文件,避免硬编码) load_dotenv() TENANT_ID = os.getenv("TENANT_ID") CLIENT_ID = os.getenv("CLIENT_ID") CLIENT_SECRET = os.getenv("CLIENT_SECRET") SITE_DOMAIN = os.getenv("SITE_DOMAIN") # 示例:contoso.sharepoint.com SITE_NAME = os.getenv("SITE_NAME") # 示例:TeamSite(站点URL中的名称) DOC_LIB_NAME = os.getenv("DOC_LIB_NAME")# 文档库名称,比如"Shared Documents" TARGET_FOLDER_PATH = "/目标子文件夹" # 文档库下的目标文件夹路径 LOCAL_FILE_PATH = "./test_upload.pdf" # 本地待上传文件路径 def get_graph_client(): # 创建OAuth凭证 credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=CLIENT_SECRET ) return GraphServiceClient(credential) def upload_file_to_target_folder(graph_client): # 获取站点对应的Drive(文档库对应Drive资源) site = graph_client.sites.by_site_id(f"{SITE_DOMAIN}:/sites/{SITE_NAME}").get() drive = graph_client.drives.by_drive_id(site.drive.id).get() # 拼接上传路径:文档库根目录 + 目标文件夹 + 文件名 file_name = os.path.basename(LOCAL_FILE_PATH) upload_full_path = f"{DOC_LIB_NAME}{TARGET_FOLDER_PATH}/{file_name}".strip("/") # 执行文件上传 with open(LOCAL_FILE_PATH, "rb") as f: uploaded_item = graph_client.drives.by_drive_id(drive.id).items.by_drive_item_id("root").item_with_path(upload_full_path).put(content=f) print(f"文件上传完成,ID: {uploaded_item.id}") return uploaded_item def create_public_view_link(graph_client, drive_id, item_id): # 配置公共链接:允许匿名查看/下载 permission = Permission( link=ShareLinkType( type=LinkType.View, # 若需允许编辑,改为LinkType.Edit allow_anonymous_access=True ) ) # 创建并返回公共链接 shared_link = graph_client.drives.by_drive_id(drive_id).items.by_drive_item_id(item_id).create_link.post(body=permission) print(f"公共访问链接:{shared_link.link.web_url}") return shared_link if __name__ == "__main__": client = get_graph_client() uploaded_item = upload_file_to_target_folder(client) create_public_view_link(client, uploaded_item.parent_reference.drive_id, uploaded_item.id)
3. 关键说明
- 站点ID获取:如果不清楚站点名称,可通过
graph_client.sites.get_all()列出租户下所有站点,或从SharePoint站点URL中提取(比如https://contoso.sharepoint.com/sites/ProjectSite的站点名称为ProjectSite) - 大文件处理:若文件超过4MB,需改用
LargeFileUploadTask类实现分片上传,可参考官方SDK文档调整 - 权限调整:将
LinkType.View改为LinkType.Edit即可允许任何人编辑上传的文件
四、备选方案(Graph API不可用场景)
如果因权限限制无法使用Graph API,可采用SharePoint REST API + NTLM认证,但该方案仅适用于内部网络环境,且公共链接配置逻辑繁琐,不推荐生产环境使用。
内容的提问来源于stack exchange,提问作者kita
相关产品推荐
相关产品推荐

