Веб-API ASP.NET : выполнение составной пост с загрузить файл с помощью HttpClient веб-API
у меня есть служба WebApi, обрабатывающая загрузку из простой формы, например:
<form action="/api/workitems" enctype="multipart/form-data" method="post">
<input type="hidden" name="type" value="ExtractText" />
<input type="file" name="FileForUpload" />
<input type="submit" value="Run test" />
</form>
однако я не могу понять, как имитировать тот же пост с помощью API HttpClient. Элемент FormUrlEncodedContent
бит достаточно прост, но как добавить содержимое файла с именем в сообщение?
3 ответа:
после долгих проб и ошибок, вот код, который на самом деле работает:
using (var client = new HttpClient()) { using (var content = new MultipartFormDataContent()) { var values = new[] { new KeyValuePair<string, string>("Foo", "Bar"), new KeyValuePair<string, string>("More", "Less"), }; foreach (var keyValuePair in values) { content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key); } var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "Foo.txt" }; content.Add(fileContent); var requestUri = "/api/action"; var result = client.PostAsync(requestUri, content).Result; } }
вам нужно искать различные подклассы
HttpContent
.вы создаете многоформный http-контент и добавляете к нему различные части. В вашем случае у вас есть содержимое массива байтов и url-адрес формы, закодированный по линии:
HttpClient c = new HttpClient(); var fileContent = new ByteArrayContent(new byte[100]); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "myFilename.txt" }; var formData = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("name", "ali"), new KeyValuePair<string, string>("title", "ostad") }); MultipartContent content = new MultipartContent(); content.Add(formData); content.Add(fileContent); c.PostAsync(myUrl, content);
спасибо @Michael Tepper за ваш ответ.
мне пришлось разместить вложения в MailGun (поставщик электронной почты), и мне пришлось немного изменить его, чтобы он принял мои вложения.
var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(fileName)); fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") //<- 'form-data' instead of 'attachment' { Name = "attachment", // <- included line... FileName = "Foo.txt", }; multipartFormDataContent.Add(fileContent);
здесь для дальнейшего использования. Спасибо.