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

如何用Python调用SharePoint API上传文件并配置公共访问权限

SharePoint Online 文件上传+公共链接配置(Python实现)

一、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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 02:09:59