从API获取映像,然后将其存储为Azure存储Blob(图像错误)

时间:2017-08-18 10:20:50

标签: azure azure-storage azure-functions azure-ad-graph-api

所以我试图这样做:

  1. 使用Azure功能(C#或节点)中的图表Api从AD获取用户
  2. 对于每个用户,使用Graph Api(在相同的Azure功能中)
  3. 获取他们的照片
  4. 使用照片数据,将其作为blob上传到Azure存储
  5. 现在,我有1和2正常工作。但现在,我不知道如何将该image / jpeg字符串转换为Azure存储中的Blob。我已经尝试了很多,研究了很多,但它真的很难。

    我试图使用

    blob.Properties.ContentType = "image/jpeg"
    blob.UploadText(imgString);
    

    但它没有用。

    所以我的代码看起来像这样:

    1. 我从azure获得了一个新的oAuth令牌(适用于3600秒)
    2. 从AD Graph API获取/用户
    3. 对于每个用户,我使用/ user // photo / $ value resource,它返回一个image / jpeg数据。
    4. 从那个数据(一个字符串?)我尝试blob.UploadText但它失败了。
    5. 我从GraphApi获取图像数据的方式是使用RestSharp,如下所示:

      var client = new RestClient("https://graph.microsoft.com/v1.0/users/" + email + "/photo/$value");
      var request = new RestRequest(Method.GET);
      request.AddHeader("cache-control", "no-cache");
      request.AddHeader("authorization", "Bearer " + token);
      request.AddHeader("content-type", "image/jpeg");
      return client.Execute(request);
      

      所以我返回一个IRestResponse,它包含这样的内容:

      response.ContentType //to get the content type
      response.Content // to get the body (the image)
      blob.UploadText(response.Content);
      

      这就是我尝试做的事情,但它不起作用,文件保存正常但是当你打开文件时,你却无法真正看到图像。我认为问题可能是某些编码,我尝试过设置不同的编码类型而没有运气。

      看看下一张照片。在右边,我使用PHP从Graph Api获取图像,并将标题设置为image / jpeg,然后回显图像数据。有用。在左边,它是使用javascript或c#的Azure功能,我得到图像,当我尝试做同样的事情(在浏览器中显示)时,我得到一个不同的二进制字符串,页面上没有图片(如果它不是图像数据),所以看起来好像问题是编码。我使用UploadText将这个二进制数据保存在blob文件中,但它无效。

      Encoding

      有什么想法吗?

1 个答案:

答案 0 :(得分:0)

  

有什么想法吗?

请使用 RawBytes 作为blob内容。它在我身边正常工作。

blob.UploadFromByteArray(response.RawBytes,0,response.RawBytes.Length-1); 

以下是我的测试演示代码

var connectionString = "storage connection string";
CloudStorageAccount storageAccount = 
CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = 
blobClient.GetContainerReference("container");
container.CreateIfNotExists();
CloudBlockBlob blob = container.GetBlockBlobReference("test.jpeg");        
blob.UploadFromByteArray(response.RawBytes,0,response.RawBytes.Length-1);