IFormFile в .NET Core Web API является нулевым для загрузки файлов axios и ajax, но работает в Postman - PullRequest
0 голосов
/ 11 марта 2019

Введение

Итак, у меня есть API, который будет загружать файл в Azure со следующей подписью:

public async Task<IActionResult> Post([FromForm]IEnumerable<IFormFile> files)

Этот API был построен и протестирован с Postman, и он прекрасно работает со следующими параметрами:

Postman API

Но когда я пытаюсь вызвать его в своем приложении реакции с помощью jJuery AJAX, сгенерированного Postman или axios, файловая переменная IFormFile будет иметь значение null.

handleFileChange = async (event) => {
    let formData = new FormData();
    let files = event.target.files[0];
    formData.append('file', logo); // Can put "files" here or the imported picture "logo"


 console.log("Form Data:", formData.get("files"));
    await axios.post('api/files/uploadfiles', formData,{
        'content-type': "multipart/form-data",
        'Content-Type': "multipart/form-data",
    })
         .then(response => response.data)
        .then(data => console.log("File Upload Response:" , data));
}

API Запрос на получение .NET Core с помощью axios / ajax

enter image description here

API Запрос, который получает .NET Core с почтальоном

enter image description here Здесь вы заметите, что основным отличием является то, что у Почтальона есть файл под файлами, в то время как запрос axios, кажется, ссылается на него только в «Представлении результатов», но ничего не имеет в файлах. Я добавляю правильный элемент в форму? Я пробовал это с импортированным изображением, а также с динамическим из следующего поля ввода:

<FormGroup id = 'file-form'>
    <Label for="file">Attach Files:</Label>
    <Input type="file" name="files" id="File" onChange={this.handleFileChange}/>
</FormGroup>

но не повезло. Любая помощь будет чрезвычайно оценен !!


Обновление # 1

После просмотра некоторой документации по Microsoft я обнаружил оговорку в документах Microsoft, в которой говорится, что для формы multict / form-data используется энтип формы. Я попытался это безрезультатно.

1 Ответ

2 голосов
/ 11 марта 2019

Вот как я это сделал в методе действия:

[HttpPost]
public void Post([FromForm]ValueFile files)
{
     //do logic
}

Затем я создаю ViewModel с именем ValueFile

public class ValueFile
{
    public IEnumerable<IFormFile> Files { get; set; }
}

В моем веб-клиенте я использовал jquery ajax:

$('#fileTest').on('change',
        function() {

            var fd = new FormData();
            fd.append('files', $('#fileTest')[0].files[0]);

            $.ajax({
                "async": true,
                "crossDomain": true,
                "url": "http://localhost:5000/api/values",
                "method": "POST",
                "processData": false,
                "contentType": false,
                "mimeType": "multipart/form-data",
                "data": fd
            }).done(function (response) {
                console.log(response);
            });
        });

<form id='file-form'>
    <Label for="file">Attach Files:</Label>
    <Input type="file" name="files" id="fileTest"  />
</form>

Надеюсь, это поможет

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