.NET Core Web API 中的 IFormFile 对于 axios 和 ajax 文件上传为空,但在 Postman 中有效

IT技术 javascript reactjs asp.net-core axios asp.net-core-webapi
2021-05-03 10:43:20

介绍

所以我有一个 API,它将使用以下签名将文件上传到 Azure:

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

这个 API 是用 Postman 构建和测试的,它适用于以下参数:

邮递员API

但是,当我尝试在我的 React 应用程序中使用 Postman 或 axios 生成的 AJAX jQuery 调用它时,IFormFile 文件变量为空。

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));
}

.NET Core 通过 axios/ajax 获取的 API 请求

在此处输入图片说明

.NET Core 通过 Postman 获取的 API 请求

在此处输入图片说明 你会注意到这里的主要区别在于 Postman 在 files 下有文件,而 axios 请求似乎只在“结果视图”下引用它,但在 files 下没有任何内容。我是否将正确的项目附加到表单中?我已经尝试使用导入的图像以及来自以下输入字段的动态图像:

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

但没有运气。任何帮助将不胜感激!


更新 #1

在查看了一些 Microsoft文档后,在 Microsoft文档中发现了一个警告,即表单的 enctype 为“multipart/form-data”。我尝试这样做无济于事。

1个回答

这就是我在 action 方法中的做法:

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

然后我创建一个名为 ValueFile 的 ViewModel

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

在我的 Web 客户端中,我使用了 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>

希望这可以帮助