web-dev-qa-db-fra.com

Réception d'un fichier et d'autres données de formulaire ensemble dans l'API Web principale ASP.NET (analyse de requête basée sur les limites)

Comment formeriez-vous vos paramètres pour la méthode d'action censée recevoir une valeur file et une valeur text de la demande?

J'ai essayé ça

public string Post([FromBody]string name, [FromBody]IFormFile imageFile)

Et essayé de le frapper de Postman mais il me donne 500 Internal Server Error. Je ne peux pas non plus le déboguer car il ne frappe jamais la première instruction de la méthode d'action où j'ai placé mon point d'arrêt.

Avez-vous une idée de la façon dont nous pouvons analyser les demandes basées sur les limites et extraire le ou les fichiers et autres champs textuels? Je suis nouveau sur ASP.NET Core.

7
shashwat

J'ai eu le même problème et j'ai résolu le problème en utilisant l'attribut [FromForm] et FileUploadModelView dans la fonction comme suit:

[HttpPost]
        [Route("upload")]
        public async Task<IActionResult> Upload([FromForm] FileUploadViewModel model, [FromForm] string member_code)
        {
            var file = model.File;

            ...
        }
10
Ye Yint

J'utilise le code suivant pour accomplir ceci afin d'analyser une réponse de Mailgun , qui comprend à la fois des fichiers et des valeurs de texte.

Notez que "dashifying" est juste pour que des noms de propriété tels que "MessageHeaders" soient transformés en "message-headers"; vous devez évidemment utiliser la logique qui convient à votre cas d'utilisation.

Manette:

using System;
using Microsoft.AspNetCore.Mvc;
using NuGet.Protocol.Core.v3;

namespace Potato
{
    [Route("api/[controller]")]
    public class MailgunController : Controller
    {
        [HttpPost]
        public IActionResult Post()
        {
            MailgunEmail email = new MailgunEmail(Request);

            return Ok(email.ToJson());
        }
    }
}

Modèle:

using System;
using System.Reflection;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;

namespace Potato
{
    public class MailgunEmail
    {
        public IEnumerable<IFormFile> Attachments { get; set; }

        public string Recipient { get; set; }
        public string Sender { get; set; }
        public string From { get; set; }
        public string Subject { get; set; }
        public string BodyPlain { get; set; }
        public string StrippedText { get; set; }
        public string StrippedSignature { get; set; }
        public string BodyHtml { get; set; }
        public string StrippedHtml { get; set; }
        public int? AttachmentCount { get; set; }
        public int Timestamp { get; set; }
        public string Token { get; set; }
        public string Signature { get; set; }
        public string MessageHeaders { get; set; }
        public string ContentIdMap { get; set; }

        public MailgunEmail(HttpRequest request)
        {
            var form = request.Form;

            Attachments = new List<IFormFile>(form.Files);

            foreach (var prop in typeof(MailgunEmail).GetProperties()) {
                string propName = Dashify(prop.Name);
                var curVal = form[propName];
                if (curVal.Count > 0) {
                    prop.SetValue(this, To(curVal[0], prop.PropertyType), null);
                }
            }
        }

        private object To(IConvertible obj, Type t)
        {
            Type u = Nullable.GetUnderlyingType(t);

            if (u != null) {
                return (obj == null) ? GetDefaultValue(t) : Convert.ChangeType(obj, u);
            } else {
                return Convert.ChangeType(obj, t);
            }
        }

        private object GetDefaultValue(Type t)
        {
            if (t.GetTypeInfo().IsValueType) {
                return Activator.CreateInstance(t);
            }
            return null;
        }

        private string Dashify(string source)
        {
            string result = "";
            var chars = source.ToCharArray();
            for (int i = 0; i < chars.Length; ++i) {
                var c = chars[i];
                if (i > 0 && char.IsUpper(c)) {
                    result += '-';
                }
                result += char.ToLower(c);
            }
            return result;
        }
    }
}
4
Daniel Centore

Cette page m'a beaucoup aidé https://docs.Microsoft.com/en-us/aspnet/core/mvc/models/file-uploads

alors maintenant dans mon code j'ai la méthode du contrôleur comme:

 public async Task<IActionResult> UploadFiles(UploadedFile ups)

et une classe pour le modèle en tant que

public class UploadedFile
    {
        public string UploadName { get; set; }
        public List<IFormFile> Files { get; set; }
    }

et la forme comme 

<form method="post" enctype="multipart/form-data" asp-controller="Files" asp-action="UploadFiles">
1
mslliviu

Je suppose que vous transmettez le fichier et le texte au format JSON approprié.

Vous devez créer une nouvelle classe qui inclut le fichier et le texte en tant que propriétés de type chaîne. Ajoutez la nouvelle classe à vos arguments de méthode avec l'attribut [FromBody] et vous pourrez analyser la chaîne de l'image en fonction de vos besoins.

Une autre façon serait d’accéder à l’ensemble du contenu de la demande via

await Request.Content.ReadAsStringAsync();

Il vous faudrait alors analyser tout le contenu.

0
FelschR