Загрузка файла из консольного приложения в WebAPI - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь опубликовать файл + некоторую информацию в WebApi, которым я управляю. Моя проблема в том, что я не могу получить доступ к файлу на стороне WebAPI, все остальные поля в порядке.

Вот мой код консольного приложения

using (HttpClient client = new HttpClient())
{
    using (MultipartFormDataContent content = new MultipartFormDataContent())
    {
        string filename = "my_filename.png";

        content.Add(new StringContent(DateTime.Now.ToString("yyyy-MM-dd")), "data");


        byte[] file_bytes = webClient.DownloadData($"https://my_url/my_file.png");
        content.Add( new ByteArrayContent(file_bytes), "file");

        string requestUri = "http://localhost:51114/api/File";

        HttpResponseMessage result = client.PostAsync(requestUri, content).Result;
        Console.WriteLine("Upload result {0}", result.StatusCode);
    }
}

Вот мой код WebAPI

 [HttpPost]
 public void Post(IFormFile file, [FromForm] DateTime data)
 {
     if (file == null || file.Length == 0)
     {
         Response.StatusCode = StatusCodes.Status400BadRequest;
         return;
     }
     // Never reaches this point..... file is null

 }

Есть какие-нибудь указатели на то, чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете извлечь содержимое и преобразовать его в байтовый массив в 2 строки кода, при условии, что вы отправляете только один файл (Примечание). Хорошая идея - использовать асинхронную передачу файлов, чтобы вы не потребляли как много процессорного времени:

var provider = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider());
var file = provider.Contents.Single();
0 голосов
/ 26 июня 2018

Если я не ошибаюсь, вы можете отправить файл на конечную точку WebAPI, отправив его как FormData с Content-Type : multipart/form-data, что-то вроде этого.

[HttpPost]
[Route("..."]
public void ReceiveFile()
{
     System.Web.HttpPostedFile file = HttpContext.Current.Request.Files["keyName"];
     System.IO.MemoryStream mem = new System.IO.MemoryStream();
     file.InputStream.CopyTo(mem);
     byte[] data = mem.ToArray();
     // you can replace the MemoryStream with file.saveAs("path") if you want.

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...