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

仅知文件名无sourcedoc时从SharePoint下载文件的方案问询

背景与现有实现

现有一段通过PnP Framework从SharePoint下载.pptx文件的代码:

using (ClientContext clientContext = new PnP.Framework.AuthenticationManager().GetACSAppOnlyContext(siteUrl, clientID, clientSecret)) 
{
    Web web = clientContext.Web;
    fileUrl = downloadUrl + fileUrl + ".pptx";
    Microsoft.SharePoint.Client.File filetoDownload = web.GetFileByUrl(fileUrl);

    clientContext.Load(filetoDownload);
    clientContext.ExecuteQuery();

    Helper.CreateIfMissing(filePath);

    var stream = filetoDownload.OpenBinaryStream();
    clientContext.ExecuteQuery();

    var fileName = Path.Combine(filePath, (string)filetoDownload.Name);

    // 添加下载配置
    using (var fileStream = new FileStream(fileName, FileMode.Create))
    {
        stream.Value.CopyTo(fileStream);
    }

    path = fileName;
 }

配置信息如下:

"downloadUrl": "https://abc.sharepoint.com/:p:/r/sites/abcFolder/_layouts/15/Doc.aspx?sourcedoc=%7BA6BACCWE-E545-4823-A765-749100023273%7D&file="

SharePoint文件夹结构为:

www.abcsite.com/MainFolder/SubFolder/FileName

文件格式为.pptx。

技术问询

我希望实现文件下载,现有两种思路,特咨询可行性:

  1. 由于SharePoint文件夹中每个文件都有独立的sourcedoc,能否通过用户输入的文件名获取对应的sourcedoc?
  2. 是否可以无需sourcedoc,仅通过文件名完成文件下载?
解决方案

针对你的两个问题,可行性及实现方式如下:

问题1:通过文件名获取对应的sourcedoc

完全可行。你可以查询文件所在的目标文件夹,根据文件名定位到文件后,直接获取其UniqueId(即sourcedoc对应的GUID值)。示例代码如下:

using (ClientContext clientContext = new PnP.Framework.AuthenticationManager().GetACSAppOnlyContext(siteUrl, clientID, clientSecret))
{
    Web web = clientContext.Web;
    // 替换为目标文件夹的服务器相对路径,例如 "/sites/abcFolder/MainFolder/SubFolder"
    string folderServerRelativeUrl = "/sites/abcFolder/MainFolder/SubFolder";
    Folder targetFolder = web.GetFolderByServerRelativeUrl(folderServerRelativeUrl);
    clientContext.Load(targetFolder.Files);
    clientContext.ExecuteQuery();

    // 用户输入的文件名
    string inputFileName = "目标文件名.pptx";
    var targetFile = targetFolder.Files.FirstOrDefault(f => f.Name.Equals(inputFileName, StringComparison.OrdinalIgnoreCase));

    if (targetFile != null)
    {
        // 获取sourcedoc对应的GUID
        string sourcedocGuid = targetFile.UniqueId.ToString();
        // 后续可使用该GUID拼接下载链接
    }
}

问题2:无需sourcedoc,仅通过文件名完成下载

当然可以,这也是更直接的实现方式。你可以通过文件的服务器相对路径,或者先查询文件夹/文档库中的文件,匹配文件名后直接下载。示例代码如下:

方式1:通过服务器相对路径直接定位文件

using (ClientContext clientContext = new PnP.Framework.AuthenticationManager().GetACSAppOnlyContext(siteUrl, clientID, clientSecret))
{
    Web web = clientContext.Web;
    // 文件的服务器相对路径,格式为 "/sites/站点名/文件夹路径/文件名.pptx"
    string fileServerRelativeUrl = "/sites/abcFolder/MainFolder/SubFolder/目标文件名.pptx";
    Microsoft.SharePoint.Client.File filetoDownload = web.GetFileByServerRelativeUrl(fileServerRelativeUrl);

    clientContext.Load(filetoDownload);
    clientContext.ExecuteQuery();

    Helper.CreateIfMissing(filePath);

    var stream = filetoDownload.OpenBinaryStream();
    clientContext.ExecuteQuery();

    var fileName = Path.Combine(filePath, filetoDownload.Name);

    using (var fileStream = new FileStream(fileName, FileMode.Create))
    {
        stream.Value.CopyTo(fileStream);
    }

    path = fileName;
}

方式2:查询文档库匹配文件名后下载

using (ClientContext clientContext = new PnP.Framework.AuthenticationManager().GetACSAppOnlyContext(siteUrl, clientID, clientSecret))
{
    Web web = clientContext.Web;
    // 替换为目标文档库的标题
    List docLibrary = web.Lists.GetByTitle("文档库标题");
    CamlQuery query = new CamlQuery();
    query.ViewXml = "<View><Query><Where><Eq><FieldRef Name='FileLeafRef'/><Value Type='Text'>目标文件名.pptx</Value></Eq></Where></Query></View>";
    ListItemCollection items = docLibrary.GetItems(query);
    clientContext.Load(items);
    clientContext.ExecuteQuery();

    if (items.Count > 0)
    {
        Microsoft.SharePoint.Client.File filetoDownload = items[0].File;
        clientContext.Load(filetoDownload);
        clientContext.ExecuteQuery();

        // 执行下载逻辑
        var stream = filetoDownload.OpenBinaryStream();
        clientContext.ExecuteQuery();

        Helper.CreateIfMissing(filePath);
        var fileName = Path.Combine(filePath, filetoDownload.Name);
        using (var fileStream = new FileStream(fileName, FileMode.Create))
        {
            stream.Value.CopyTo(fileStream);
        }
        path = fileName;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:17:27