仅知文件名无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。
技术问询
我希望实现文件下载,现有两种思路,特咨询可行性:
- 由于SharePoint文件夹中每个文件都有独立的sourcedoc,能否通过用户输入的文件名获取对应的sourcedoc?
- 是否可以无需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
相关产品推荐
相关产品推荐

