如何通过Microsoft Graph下载SharePoint SiteAssets中的图片文件流?
可行方案及实现步骤
方案1:通过列表项字段值获取图片路径并下载
图片字段的存储路径会包含在列表项的字段值中,你可以通过以下步骤获取并下载:
- 调用Graph API获取目标列表项的图片字段值,图片字段返回的是包含
serverRelativeUrl的JSON对象 - 解析出
serverRelativeUrl后,直接通过站点根驱动器的ItemWithPath方法获取图片内容流
方案2:构造图片存储路径直接请求
SharePoint的列表图片字段默认存储路径格式为:/sites/{站点名称}/SiteAssets/Lists/{列表内部名称}/{图片字段内部名称}/{文件名称},你可以根据这个规则构造路径,再通过Graph API请求内容流。
方案3:使用SharePoint REST API直接请求
如果Graph SDK调用有问题,也可以直接构造REST请求获取图片流:
- 请求地址:
/_api/web/getfilebyserverrelativeurl('{图片的serverRelativeUrl}')/$value - 用
HttpClient发送GET请求,直接获取响应流
C#代码示例(Graph SDK实现)
using Microsoft.Graph; using Newtonsoft.Json.Linq; // 替换为你的站点ID、列表ID、项ID和图片字段内部名称 string siteId = "你的站点ID"; string listId = "你的列表ID"; string itemId = "你的列表项ID"; string imageFieldInternalName = "你的图片字段内部名称"; var graphClient = new GraphServiceClient(/* 已配置好的认证提供者 */); // 1. 获取列表项的图片字段值 var listItemFields = await graphClient.Sites[siteId] .Lists[listId] .Items[itemId] .Fields .Request() .Select(imageFieldInternalName) .GetAsync(); // 2. 解析图片的服务器相对路径 var imageFieldValue = listItemFields.AdditionalData[imageFieldInternalName] as JObject; string serverRelativeUrl = imageFieldValue["serverRelativeUrl"].ToString(); // 3. 下载图片流 using (var imageStream = await graphClient.Sites[siteId] .Drive .Root .ItemWithPath(serverRelativeUrl) .Content .Request() .GetAsync()) { // 此处可将stream用于应用内展示,例如转换为Bitmap或绑定到UI控件 }
注意事项
- 确保应用已申请
Sites.Read.All或Sites.ReadWrite.All权限,权限范围需覆盖目标站点 - 图片字段的内部名称可能与显示名称不同,可通过列表设置的字段详情页查看
- 如果SiteAssets驱动器在Graph中不可见,大概率是权限不足,需检查应用权限的配置范围
内容的提问来源于stack exchange,提问作者AlbertoCh
相关产品推荐
相关产品推荐

