如何用“ContentType = {image / jpeg}”作为图像C#保存响应?

时间:2017-05-26 12:53:33

标签: c# image console azure-active-directory microsoft-graph

我正在使用Microsoft Graph API从Azure Active Directory获取用户个人资料图片。

参见示例:

enter image description here

我正在使用C#console app进行此API调用。我有以下代码。

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer","MY ACCESS TOKEN");
var response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me/photo/$value");
var test = response.Content.ReadAsStringAsync();

现在,响应的内容类型为{image/jpeg}

我所获得的数据看起来与以下图片中的 Result 相同。

enter image description here

当我尝试使用以下代码将此图像保存在本地驱动器上时:

System.IO.File.WriteAllBytes(@"C:\image.bmp", Convert.FromBase64String(test.Result));

它给了我错误:

  

{System.FormatException:输入不是有效的Base-64字符串   包含一个非基础64个字符,两个以上的填充字符,或   填充字符中的非法字符。在   System.Convert.FromBase64_ComputeResultLength(Char * inputPtr,Int32   inputLength)在System.Convert.FromBase64CharPtr(Char * inputPtr,   Int32 inputLength)在System.Convert.FromBase64String(String s)
  在   Microsoft_Graph_Mail_Console_App.MailClient.d__c.MoveNext()   在d:\ Source \ MailClient.cs:第125行}

我理解这个错误,因为结果无法转换为 byte []

所以,我想知道,我可以直接使用Result属性中的数据在本地系统上创建和保存图像吗?

1 个答案:

答案 0 :(得分:2)

在图像的情况下,响应的内容是字节流而不是字符串。 因此,您只需读取响应流并将其复制到输出流。例如:

HttpResponseMessage response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me/photo/$value");
using (Stream responseStream = await response.Content.ReadAsStreamAsync())
{
    using (FileStream fs = new FileStream(@"c:\image.jpg", FileMode.Create))
    {
        // in dotnet 4.5
        await source.CopyToAsync(fs);
    }
}

如果您是dotnet 4.0,请使用source.CopyTo(fs)代替其异步couterpart。