2017-08-18 4 views
0

Je suis en train de le faire:Obtenir l'image de l'API, puis le stocker sous forme Azure Storage Blob (erreur d'image)

  1. Obtenir les utilisateurs de AD à l'aide de Graph Api dans une fonction Azure (C# ou nœud)
  2. pour chaque utilisateur, obtenir leur photo, en utilisant le graphique Api (dans la même fonction Azure)
  3. Avec les données de photos, télécharger comme blob Azure Storage

maintenant, j'ai 1 et 2 travail correctement. Mais maintenant, je n'ai aucune idée de la façon de convertir cette chaîne image/jpeg en un blob dans Azure Storage. J'ai beaucoup essayé, j'ai beaucoup étudié mais c'était vraiment difficile.

J'ai essayé d'utiliser

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

Mais cela ne fonctionne pas.

Alors mon code ressemble à ceci:

  1. Je reçois un jeton frais OAuth d'azur (bon pour 3600 sec)
  2. Get/Utilisateurs de l'API AD Graphique
  3. Pour chaque utilisateur, je use/user // photo/$ value resource, qui retourne une image/jpeg data.
  4. De ces données (une chaîne?) J'essaye de blob.UploadText mais il échoue.

La façon dont je reçois les données d'image de GraphApi utilise RestSharp, comme ceci:

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); 

Je reviens donc un IRestResponse, qui contient quelque chose comme ceci:

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

Et c'est ce que j'essaie de faire, mais ça ne marche pas, le fichier est sauvegardé correctement mais quand vous l'ouvrez, vous ne pouvez pas vraiment voir l'image. Je pense que le problème pourrait être un peu d'encodage, j'ai essayé de définir différents types d'encodage sans succès.

Jetez un oeil à la photo suivante. À droite, j'ai obtenu l'image de Graph Api en utilisant PHP, et j'ai défini l'en-tête en image/jpeg, puis en écho avec les données de l'image et c'est tout. Ça marche. A gauche, c'est la fonction Azure avec javascript ou C#, j'obtiens l'image et quand j'essaye de faire la même chose (montrer dans le navigateur) j'obtiens une chaîne binaire différente et pas d'image sur la page (comme si elle n'était pas données d'image), il semble donc que le problème est l'encodage. J'enregistre ces données binaires sur un fichier blob avec UploadText mais cela ne fonctionne pas.

Encoding

Toutes les idées?

+0

vous ne pouvez pas obtenir '' Stream' ou byte [] 'partir de l'étape 2? – Mikhail

Répondre

0

Des idées?

S'il vous plaît devez utiliser RawBytes comme contenu blob. Cela fonctionne correctement de mon côté.

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

Voici mon test du code de démonstration

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); 
+0

Merci. J'ai fini par créer une autre fonction en utilisant PHP comme langage. Cela a fonctionné comme il se doit, mais je vais essayer votre méthode pour voir si cela fonctionne. – mikesoft