Не может отправлять как файлы, так и объекты внутри формы - PullRequest
0 голосов
/ 12 февраля 2019

Здравствуйте, мне было интересно, как вы можете отправить и POCO и files в форме.Моя проблема двоякая:

  • 1. Так далеко, когда я получаю доступ к Request.Form.Files[0] и копирую его в файл, я получаю файл 0kb.
  • Если яхочу получить объект MyPoco из моей формы, когда я использую [FromBody] в качестве параметра для моего метода, я получаю 415 неподдерживаемый тип.

Форма

<form id="createForm" method="post" enctype="multipart/form-data" action="http://localhost:8300/api/create">

<input type="text" bind="@model.Name"/>//some binding here
<input type="text" bind="@model.Id"/> //some binding...

<input type="file"/>
</form>

Контроллер

[HttpPost]
        [Route("api/create")]
        public async Task<long> CreateAsync([FromBody] MyPoco poco) { //getting error 415 when using the FromBody 
            try {

                MyPoco poc = poco;
                string path = Path.Combine(
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
                    "file.csv"); //copy the input file -> getting 0kb file
                FileStream stream = new FileStream(path, FileMode.Create);
                await this.Request.Form.Files[0].CopyToAsync(stream);
                return 3;
            } catch (Exception) {
                return 0;
            }
        }

PS Синтаксис привязки blazor, но в данном случае это неважно.

1 Ответ

0 голосов
/ 12 февраля 2019

Избегайте использования [FromBody], он попросит ModelBinder прочитать всю полезную нагрузку, а затем сериализовать ее как экземпляр MyPoco.

. Для достижения ваших целей вы можете объявить свой метод действия следующим образом:

[HttpPost("[action]")]
public IActionResult Test(MyPoco myPoco,IFormFile myfile){
     // now you get the myfile file and the myPoco 
}

, а затем отправьте поля с полными именами:

<form id="createForm" method="post" enctype="multipart/form-data" action="/api/SampleData/Test">

    <input name="MyPoco.Name" type="text" bind="@model.Name" />
    <input name="MyPoco.Id" type="text" bind="@model.Id" />

    <input name="myfile" type="file" />
    <button type="submit">submit this form</button>
</form>

снимок экрана с демонстрацией:

enter image description here

...