IFormFile всегда нулевой при получении файла из консольного приложения - PullRequest
0 голосов
/ 12 сентября 2018

Мой метод WebApi готов принять файл в качестве параметра, показанного ниже: (например, uri "https://localhost:44397/api/uploadfile"

 [Route("api/[controller]")]
 [ApiController]
 public class UploadFileController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm] IFormFile file)
    {
    }
}

Я использую консольное приложение для отправки файла в этот метод API, ниже приведен мой код:

    public static void Send(string fileName)
    {
        using (var client = new HttpClient())
        using (var content = new MultipartFormDataContent())
        {
            client.BaseAddress = new Uri("https://localhost:44397");
            var fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            var index = fileName.LastIndexOf(@"\");
            var fn = fileName.Substring(index + 1);
            fs.Position = 0;

            var contentfile = new StreamContent(fs);
            content.Add(contentfile, "file", fn);
            var result = client.PostAsync("/api/uploadfile", content).Result;
        }
    }

Я также проверил с другими клиентами (например, Почтальон), и там тоже произошел сбой (так что похоже на проблему на стороне сервера, а не в консольном приложении).

Не уверен, что я делаю не так. Каждый раз, когда я проверяю, мой параметр файла метода WebApi всегда имеет значение null.

Может ли кто-нибудь помочь мне найти решение этой проблемы. Я пытался искать в блоге, но безрезультатно. Возможно, я что-то делаюнаивный здесь. Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Наконец я сделал это Работающим.Это должно быть ошибка в Microsoft, или они могут изменить способ работы с .net core 2.1 для ApiController.

Я изменил свой метод WebApi на следующий и вуаля, он работал.

Примечание: удалил ApiController и все заработало.Microsoft должна документировать это.

[Route("api/[controller]")]
public class OCRController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm] IFormFile file)
    {
    }
}

Это может помочь тому, кто борется, как я.

0 голосов
/ 10 декабря 2018

Ответ на этот вопрос все еще стоит, но для любого, кто хочет сохранить атрибут [ApiController], есть обходной путь, как описано в этом потоке GitHub.

По сути, попробуйте расширить атрибут [FromForm] примерно так ...

[Route("api/[controller]")]
public class OCRController : ControllerBase
 {
    [HttpPost]
    public async Task<IActionResult> Post([FromForm(Name = "file")] IFormFile file)
    {
    }
}
0 голосов
/ 12 сентября 2018

попробуйте явно указать тип контента для вашего MultipartFormDataContent

var contentfile = new StreamContent(fs);
contentfile.Headers.ContentType = MimeMapping.GetMimeMapping(fileName);
content.Add(contentfile, "file", fn);
...