0

I have a problem with getting profile image from Delve account. Here is the example of link which returns me photo when i put it into browser: https://orgname.sharepoint.com/_vti_bin/DelveApi.ashx/people/profileimage?userId=alias@org.com&size=L

Now I need to get this photo from code. I tried such way, that works perfect for external images not in Office365:

 var credentials = new NetworkCredential("myemail", "password");
 using (var handler = new HttpClientHandler { Credentials = credentials })
 using (var client = new HttpClient(handler))
 {
     var bytes = await client.GetByteArrayAsync(url);
     return Convert.ToBase64String(bytes);
 }

But as responce I get html page with text like:

<H1>We can't sign you in</H1><p>Your browser is currently set to block cookies. You need to allow cookies to use this service.</p><p>Cookies are small text files stored on your computer that tell us when you're signed in. To learn how to allow cookies, check the online help in your web browser.</p>

I think it is related with Office365 Authorization, but I don`t know how to perform REST request to this url with my credentials...

Denys Demchenko
  • 218
  • 2
  • 12

2 Answers2

1

Problem Solved, first we need to initialize SharePoint Context:

public ClientContext SetupSpContext()
    {
        // This builds the connection to the SP Online Server
        var clientContext = new ClientContext(_sharePointCrmDocumentsSiteName);
        var secureString = new SecureString();
        foreach (var c in _sharePointCrmDocumentsPwd.ToCharArray()) secureString.AppendChar(c);
        {
            clientContext.Credentials = new SharePointOnlineCredentials(_sharePointCrmDocumentsLoginName, secureString);
        }
        var web = clientContext.Web;
        clientContext.Load(web);
        clientContext.ExecuteQuery();
        return clientContext;
    }

Then we can Get profile picture from Shrepoint using User email:

public string DownloadProfilePictureAsBase64(string email)
    {
        try
        {
            var pictureUrl = GetPictureUrl(email);

            var fileInfo = File.OpenBinaryDirect(_sharePointContext, pictureUrl);
            using (var memory = new MemoryStream())
            {
                var buffer = new byte[1000000];

                int nread;
                while ((nread = fileInfo.Stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    memory.Write(buffer, 0, nread);
                }
                memory.Seek(0, SeekOrigin.Begin);

                var buffer2 = new byte[memory.Length];

                memory.Read(buffer2, 0, buffer2.Length);
                return Convert.ToBase64String(buffer2);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Picture for user {email} can not be downloaded");
            Console.WriteLine(ex.Message);
        }
        return null;
    }

    private string GetPictureUrl(string email)
    {
        string targetUser = $"i:0#.f|membership|{email}";

        var peopleManager = new PeopleManager(_sharePointContext);
        var personProperties = peopleManager.GetPropertiesFor(targetUser);
        _sharePointContext.Load(personProperties, p => p.PictureUrl);
        _sharePointContext.ExecuteQuery();
        var pictureUri = new Uri(personProperties.PictureUrl);
        var localPath = pictureUri.LocalPath.Replace("MThumb", "LThumb"); //Change size of the picture

        return localPath;
    }
Denys Demchenko
  • 218
  • 2
  • 12
  • I wouldn't say "solved". You're getting the photos from User Profile service now instead of Delve... when the original question was how to get them from Delve. Now, in most cases they are the same... but not always. Microsoft's process here for keeping photos in sync between Exchange, Delve, and SharePoint is notorious for breaking down. A very common issue people run into having a lot of users with Delve photos and no User Profile photo in SharePoint. So this solution works most of the time, but there will likely be folks with missing photos messing up your process. – DiggyJohn May 08 '20 at 18:23
1

You should Microsoft Graph to get a user's picture. https://graph.microsoft.com/v1.0/me/photo gets your metadata about the profile picture, and https://graph.microsoft.com/v1.0/me/photo/$value gets you the image. You need to use OAuth. See https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/profilephoto_get for more details.

Venkat Ayyadevara - MSFT
  • 2,850
  • 1
  • 14
  • 11