web-dev-qa-db-ja.com

IFormFileは常にasp.netコア2.1でnullを返します

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

私の郵便配達の設定 enter image description here

Dotnetコアを2.0から2.1にアップグレードすると、機能しなくなります。これについて誰かが手助けできますか?何が悪いの

6
Herman

あなたのフォームで

enctype = "multipart/form-data"

2
Deer

以下のコードは動作するはずです

[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;
}
0
Abu Zafor

私の場合、カスタムのHttpInterceptorを使用するangular 6アプリで、APIに送信する前に、トークンとともにすべてのHttpリクエストにcontent-typeの「application/json」を追加しました。以下。 'Content-Type'を含む行を削除:application/json。それがなければ、ここでの解決策は機能しません。 .Net Coreが賢くなり、uがapiに送信しているオブジェクトを、uで作成したモデルのuに一致する限り、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}`
          }
        });
0
Habeeb

JavascriptおよびFormDataオブジェクトを使用する場合は、各ファイルの名前を「files」に設定する必要があります

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を設定することを忘れないでください

'Content-Type': 'multipart/form-data'
0
Farshid

[FromForm]属性を更新し、ヘッダーにパラメーターを配置せず、キーの名前をファイルとブランドIDに配置します。

私はテストしました、それはOk Add [FromForm] attribute

Only form-data and key is correct

メソッドの引数を変更して以下のモデルを取得し、[FromForm]を追加すると、機能するはずです。

public class FileUploadViewModel
{
    public IFormFile File { get; set; }
    public int BrandId { get; set; }
}

public async Task<BaseListResponse<MediaStorageModel>> MediaBrand([FromForm] FileUploadViewModel viewModel)
0
uowzd01

私はそれを機能させるための回避策を見つけました:

コントローラーアクションでHttpPutの代わりにHttPostを使用します。

この振る舞いにも驚きました。それが問題を修正する理由を誰かが説明できれば、それは私を助けます。

0
Vilmir