在页面之间保留照片数据的最佳方法是什么?



我正在设置一个通过第三方标识提供者(Azure AD(检索用户数据的Web应用。要获取用户的照片,我似乎需要使用他们的访问令牌进行 API 调用。获得它后,存储/持久化它以显示在他们导航到的每个视图中的最佳方法是什么?

到目前为止,我知道在显示他们的照片方面唯一有效的方法是调用 Microsoft Graph API 将照片作为内存流获取,将其转换为字节数组,然后将其存储为 base 64 字符串,稍后命名为 img 源。下面是实现相关方法的代码。

var photoStream = await graphClient.Me.Photo.Content.Request().GetAsync();
byte[] photoByte = ((MemoryStream)photoStream).ToArray();
var sessionPhoto = Convert.ToBase64String(photoByte);
ViewData["photo"] = sessionPhoto;
session.SetString("photo", sessionPhoto);

最后一行,我尝试在会话中存储 Base64String,是我之前寻找解决方案的尝试的一部分。但是,似乎从保存在ViewData["photo"]中的数据创建图像工作正常,而尝试从Session.GetString("photo")中提取会导致图像损坏。

在_Layout看来,我有:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
...
@if (ViewData["photo"] != null)
{
<img class="mr-2" src="data:image/jpeg;base64, @ViewData["photo"]" />
}
else
{
var sessionPhoto = HttpContextAccessor.HttpContext.Session.GetString("photo");
if (sessionPhoto != null)
{
<img class="mr-2" src="data:image/jpeg;base64, sessionPhoto" />
}
else
{
<i class="fas fa-user-circle fa-3x mr-3"></i>
}
}
...

我预计从 ViewData["photo"] 获取字符串会产生与从会话获取字符串相同的结果,但会话版本再次损坏。此外,我对在 .net core 中制作 Web 应用程序相对较新,甚至不确定会话是否是存储/检索照片的最佳方式,所以我愿意接受建议和替代方案。

在会话代码中,输出的是字符串sessionPhoto,而不是实际的 base64 内容。

您必须更新代码以通过预先挂起@来写入sessionPhoto的值:

<img class="mr-2" src="data:image/jpeg;base64, @sessionPhoto" />

您应该能够通过查看结果页面的源代码来查看问题。

相关内容

最新更新