Botframework v4: загрузка изображения в бот другого класса - PullRequest
1 голос
/ 15 марта 2019

У меня есть этот код в OnTurnAsync() в основном классе бота, который позволяет пользователю загружать изображение и сохранять его локально, и он работает нормально.Но как я могу это сделать, если я хочу сделать это в другом классе, как класс MainDialog?

Обновление: мне удается сделать это с помощью кода ниже.Но он принимает все, как я могу сделать проверку, которая принимает только изображения?

Обновление: ответ ниже.

public class MainDialog : ComponentDialog
{
    private const string InitialId = "mainDialog";
    private const string TEXTPROMPT = "textPrompt";
    private const string ATTACHPROMPT = "attachPrompt";

    public MainDialog(string dialogId)
        : base(dialogId)
    {
        WaterfallStep[] waterfallSteps = new WaterfallStep[]
         {
             FirstStepAsync,
             SecondStepAsync,
         };
        AddDialog(new WaterfallDialog(InitialId, waterfallSteps));
        AddDialog(new AttachmentPrompt(ATTACHPROMPT));
    }

    private static async Task<DialogTurnResult> FirstStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        return await stepContext.PromptAsync(
              ATTACHPROMPT,
              new PromptOptions
              {
                  Prompt = MessageFactory.Text($"upload photo."),
                  RetryPrompt = MessageFactory.Text($"upload photo pls."),
              });
    }

    private static async Task<DialogTurnResult> SecondStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        var activity = stepContext.Context.Activity;

        if (activity.Attachments != null && activity.Attachments.Any())
        {
            foreach (var file in stepContext.Context.Activity.Attachments)
            {
                var remoteFileUrl = file.ContentUrl;

                var localFileName = Path.Combine(Path.GetTempPath(), file.Name);

                using (var webClient = new WebClient())
                {
                    webClient.DownloadFile(remoteFileUrl, localFileName);
                }

                await stepContext.Context.SendActivityAsync($"Attachment {stepContext.Context.Activity.Attachments[0].Name} has been received and saved to {localFileName}.");
            }
        }

        return await stepContext.EndDialogAsync();
    }

Удалось сделать это с помощью этого кода.

            var activity = stepContext.Context.Activity;
        if (activity.Attachments != null && activity.Attachments.Any())
        {
            foreach (var file in stepContext.Context.Activity.Attachments)
            {
                if (file.ContentType.EndsWith("/jpg") || file.ContentType.EndsWith("/png") || file.ContentType.EndsWith("/bmp") || file.ContentType.EndsWith("/jpe"))
                {
                    var remoteFileUrl = file.ContentUrl;

                    var localFileName = Path.Combine(Path.GetTempPath(), file.Name);

                    using (var webClient = new WebClient())
                    {
                        webClient.DownloadFile(remoteFileUrl, localFileName);
                    }

                    await stepContext.Context.SendActivityAsync($"Attachment {stepContext.Context.Activity.Attachments[0].Name} has been received and saved to {localFileName}.");
                    return await stepContext.NextAsync();
                }
                else
                {
                    await stepContext.Context.SendActivityAsync($"Attachment {file.Name} is not an image, it is {file.ContentType}.");

                    // restart the dialog from top
                    return await stepContext.ReplaceDialogAsync(InitialId);
                }
            }
        }

1 Ответ

0 голосов
/ 16 марта 2019

Как сказал Николас Р., вы можете выполнить некоторые базовые проверки, например:

foreach (var file in activity.Attachments)
{
    if (file.ContentType.StartsWith("image/", StringComparison.OrdinalIgnoreCase))
    {
        await turnContext.SendActivityAsync($"Attachment {file.Name} is an image of type {file.ContentType}.");
    }
    else
    {
        await turnContext.SendActivityAsync($"Attachment {file.Name} is not an image, it is {file.ContentType}.");
    }
}

Это, конечно, разрешит любое вложение с типом контента, который начинается с "image /". Возможно, вы не захотите разрешать какой-либо тип содержимого, начинающийся с «image /», и в этом случае вы захотите составить список допустимых типов, таких как «image / png» и «image / jpeg». Вы могли бы также рассмотреть проверку расширения файла (чтобы видеть, является ли это ".png" или ".jpg" и т.д.)

...