[英]IFormFile always return null in asp.net core 2.1
Api方法如下所示
[HttpPost]
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand(IFormFile file, int brandId)
{
var files = new List<IFormFile>();
files.Add(file);
var response = await this.Upload(files, "brand", brandId);
return response;
}
将我的 dotnet 核心从 2.0 升级到 2.1 后无法正常工作,任何人都可以对此提供帮助。 出了什么问题
我遇到了同样的问题,我能够通过将 'Name' 命名参数应用于表单中文件字段名称的 FromForm 属性来修复它。 它指定表单中的哪个字段绑定到方法参数。 更改您的方法签名,如下所示。
[HttpPost("status")]
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromForm(Name ="file")] IFormFile file, int brandId)
确保表单是正确的编码类型
<form asp-action="Edit" enctype="multipart/form-data">
我还必须根据生成的代码更改模型绑定的工作方式:
public async Task<IActionResult> Edit([Bind("Text,Example")] Example example)
到这个代码:
public async Task<IActionResult> Edit(Example example)
在您的表单中使用
enctype="multipart/form-data"
添加 (Name = "body") 到 from 表单对我有用
服务器调用:
[HttpPost]
[Route("UploadImage")]
public IActionResult UploadImage([FromForm(Name = "body")]IFormFile formData)
客户端代码:
let formData = new FormData();
formData.append('body', event.target.files[0]);
const config = {
headers: {
'content-type': 'multipart/form-data',
},
}
axios.post(ApiURL,formData, config);
我找到了一个解决方法来使它工作:
在控制器操作上使用
HttpPut
而不是HttPost
。
我也对这种行为感到惊讶。 如果有人可以解释为什么它可以解决问题,那将对我有所帮助。
更改您的方法参数以采用以下模型并添加 [FromForm],它应该可以工作。
public class FileUploadViewModel
{
public IFormFile File { get; set; }
public int BrandId { get; set; }
}
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromForm] FileUploadViewModel viewModel)
下面的代码应该工作
[HttpPost]
public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromQuery] int brandId, IFormFile file)
{
var files = new List<IFormFile>();
files.Add(file);
var response = await this.Upload(files, "brand", brandId);
return response;
}
如果您使用 javascript 和 FormData 对象,则需要将每个文件的名称设置为“文件”
this.files.forEach((f) => {
formData.append("files", f, `${this.path}/${f.name}`);
});
如果您在帖子中使用其他名称,则需要在 post 方法的属性中设置它
formData.append("someName", f, `${this.path}/${f.name}`);
public async Task<IActionResult> Post([FromForm(Name ="someName")] List<IFormFile> files)
不要忘记设置内容类型
'Content-Type': 'multipart/form-data'
就我而言,我有一个使用自定义 HttpInterceptor 的 angular 6 应用程序,它在发送到 api 之前将“application/json”的内容类型与令牌一起添加到每个 Http 请求中。 像下面这样的东西。 删除带有 'Content-Type': application/json
。 没有它,这里的任何解决方案都不起作用。 .Net Core 现在更智能,可以转换您发送到 api 的任何对象,到目前为止它与您为该对象创建的模型相匹配。
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class JwtHttpInterceptor implements HttpInterceptor {
constructor() {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem('token');
let clone: HttpRequest<any>;
if (token) {
clone = request.clone({
setHeaders: {
Accept: `application/json`,
'Content-Type': `application/json`,
Authorization: `Bearer ${token}`
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.