user1308133
user1308133

Reputation: 43

How to read attachment content from bot framework C#?

I am writing a bot and expecting the user to send me an attachment, which I want to read and translate into objects.

I have the following code so far:

if (message.Attachments != null && message.Attachments.Any())
{
    var attachment = message.Attachments.First();
    using (HttpClient httpClient = new HttpClient())
    {
        if ((message.ChannelId.Equals("skype", StringComparison.InvariantCultureIgnoreCase) || message.ChannelId.Equals("msteams", StringComparison.InvariantCultureIgnoreCase)) && new Uri(attachment.ContentUrl).Host.EndsWith("skype.com"))
        {
            var token = await new MicrosoftAppCredentials().GetTokenAsync();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
        }

        var responseMessage = await httpClient.GetAsync(attachment.ContentUrl); 
        var contentLenghtBytes = responseMessage.Content.Headers.ContentLength; // this is populated correctly

        if(attachment.Name.ToLower().Equals("opportunity.xlsx"))
        {
            var temp = attachment.Content; // This Content is always null, even though everything else is populated.
        }
    }
}

Anyone can suggest how can I read the attachment xlsx content please?

Thanks

Upvotes: 2

Views: 1879

Answers (2)

Ezequiel Jadib
Ezequiel Jadib

Reputation: 14787

The attachment is not available in the Content property. You first need to download the attachment using the ContentUrl and then perform whatever you want, using the response message after downloading the file.

Take a look at the Receive-Attachments C# sample.

public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
    var message = await argument;

    if (message.Attachments != null && message.Attachments.Any())
    {
        var attachment = message.Attachments.First();
        using (HttpClient httpClient = new HttpClient())
        {
            // Skype & MS Teams attachment URLs are secured by a JwtToken, so we need to pass the token from our bot.
            if ((message.ChannelId.Equals("skype", StringComparison.InvariantCultureIgnoreCase) || message.ChannelId.Equals("msteams", StringComparison.InvariantCultureIgnoreCase)) 
                && new Uri(attachment.ContentUrl).Host.EndsWith("skype.com"))
            {
                var token = await new MicrosoftAppCredentials().GetTokenAsync();
                httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            }

            var responseMessage = await httpClient.GetAsync(attachment.ContentUrl);

            var contentLenghtBytes = responseMessage.Content.Headers.ContentLength;

            await context.PostAsync($"Attachment of {attachment.ContentType} type and size of {contentLenghtBytes} bytes received.");
        }
    }
    else
    {
        await context.PostAsync("Hi there! I'm a bot created to show you how I can receive message attachments, but no attachment was sent to me. Please, try again sending a new message including an attachment.");
    }

    context.Wait(this.MessageReceivedAsync);
} 

Upvotes: 4

Dev Raj Gautam
Dev Raj Gautam

Reputation: 123

You will have to use some other dll to read the excel data, if that is what you mean. Do u mean to read the contents of the excel file after it has been uploded then you could use https://github.com/ExcelDataReader/ExcelDataReader

Upvotes: 0

Related Questions