web-dev-qa-db-fra.com

IFormFile renvoie toujours null dans asp.net core 2.1

La méthode API ressemble à ci-dessous

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

Ma configuration de facteur enter image description here

Mettre à niveau mon noyau dotnet de 2.0 à 2.1, ce qui ne fonctionne pas, quelqu'un peut-il aider à ce sujet. Qu'est-ce qui ne va pas

6
Herman

Dans votre formulaire, utilisez

enctype = "multipart/form-data"

2
Deer

Le code ci-dessous devrait fonctionner

[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

Dans mon cas, j'avais une application angular 6 utilisant un HttpInterceptor personnalisé qui ajoute le type de contenu "application/json" à chaque demande Http avec un jeton avant d'envoyer à une api. Quelque chose comme ci-dessous. Supprimez la ligne avec "Content-Type": application/json. Sans cela, aucune des solutions ne fonctionne ici. .Net Core est maintenant plus intelligent pour traduire tout objet que vous envoyez à l'API jusqu'à présent, il correspond au modèle que vous créez pour l'objet en angulaire.

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

Si vous utilisez javascript et un objet FormData, vous devez définir le nom de chaque fichier sur "fichiers"

this.files.forEach((f) => {
         formData.append("files", f, `${this.path}/${f.name}`);
      }); 

si vous utilisez un autre nom dans votre publication, vous devez le définir dans l'attribut de la méthode de publication

formData.append("someName", f, `${this.path}/${f.name}`);

 public async Task<IActionResult> Post([FromForm(Name ="someName")] List<IFormFile> files)

N'oubliez pas de définir le type de contenu

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

Mettez à jour l'attribut [FromForm], et ne mettez pas de paramètre dans les en-têtes, et mettez le nom de la clé est file et brandId.

J'ai testé, c'est Ok Add [FromForm] attribute

Only form-data and key is correct

0

Modifiez votre argument de méthode pour prendre le modèle ci-dessous et ajoutez [FromForm], cela devrait fonctionner.

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

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

J'ai trouvé une solution pour le faire fonctionner:

Utilisez HttpPut au lieu de HttPost sur l'action du contrôleur.

J'ai également été surpris par ce comportement. Si quelqu'un peut expliquer pourquoi il résout le problème, cela m'aiderait.

0
Vilmir