Буферные файлы для отправки файлового потока на сервер - PullRequest
0 голосов
/ 16 марта 2020

Я пишу свой первый пользовательский Activity для рабочего процесса RPA UiPath, в котором мне нужно асинхронно c отправить поток файлов в бэкэнд. Это то, что я придумал, но у меня просто такое ощущение, что это не совсем работает:

 class SendFiles : AsyncCodeActivity<string>
    {
        private readonly HttpClient client = new HttpClient();
        private readonly string url = "";

        [Category("Input")]
        [RequiredArgument]
        public InArgument<List<string>> Files { get; set; }

        [Category("Input")]
        [RequiredArgument]
        public string BearerToken { get; set; }

        [Category("Output")]
        public OutArgument JsonResult { get; set; }

        protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
        {

            foreach (var filePath in Files.Get(context))
            {
                try
                {
                    using (FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read))
                    {
                        HttpContent content = new StreamContent(fs);
                        client.PostAsync(url, content);
                    }
                }
                catch (IOException e)
                {
                    Console.WriteLine(e.Message);
                    throw;
                }
            }
            return null;
        }

        protected override string EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
        {
            throw new NotImplementedException();
        }
    }

После отправки всего пакета я хочу дождаться результата обработки всей серверной части. эти файлы. как я могу выполнить sh это?

1 Ответ

0 голосов
/ 20 марта 2020
// make outer content
MultipartFormDataContent formdata = new MultipartFormDataContent();

...

// in foreach add every filestream to outer content
FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
HttpContent content = new StreamContent(fs);
string name = GetFileName(filePath);
content.Headers.Add("Content-Type", GetFileType(name));
formdata.Add(content, "files", name);

...

// after foreach, send whole outer content in one go
var resultPost = client.PostAsync(url, formdata).Result;
response = resultPost.Content.ReadAsStringAsync().Result;
succesfullRequest = resultPost.IsSuccessStatusCode;
...