簡體   English   中英

IFormFile 在 asp.net core 2.1 中總是返回 null

[英]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;
}

更新[FromForm]屬性,不要把參數放到Headers里,key的名字是file和brandId。

我測試過,沒問題添加 [FromForm] 屬性

只有表單數據和密鑰是正確的

如果您使用 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}`
          }
        });

在我的情況下,它在網絡核心中的工作方式如下

控制器:

[HttpPost]
public IActionResult ReadFormFile([FromForm]IFormFile miCsv)
{


}

請求正文:使用與參數同名的

在此處輸入圖片說明

請求頭:用作內容類型: multipart/form-data; 邊界=xxxxxxxxxxx邊界可以是任何值

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM