web-dev-qa-db-fra.com

ASPNetCore - Téléchargement d'un fichier via REST

J'utilise Insomnia pour tester une API, mais la même chose se produit avec Postman.

Je veux tester un téléchargement de fichier, avec le contrôleur suivant:

public async Task<IActionResult> Post([FromForm]IFormFile File)

Si je définis la demande comme une demande en plusieurs parties:

enter image description here

ça marche.

Cependant, si je le définis comme un fichier binaire:

enter image description here

Je ne sais pas comment obtenir les données. Comment ceci peut être fait?

De plus, dans la signature de la méthode du contrôleur, si je change [FromForm] en [FromBody], je n'obtiens pas de données.

Quelqu'un peut-il clarifier cela pour moi?

7
Thomas

Comme vous l'avez déjà remarqué, l'utilisation de l'option binary file Dans Postman/Insomnia ne fonctionne pas de manière standard. Il existe trois façons différentes de télécharger un fichier via l'API RESTful, et vous devez en choisir une.

J'ai inclus des extraits de code qui lisent le contenu du fichier téléchargé dans une chaîne et le sortent - essayez d'envoyer un fichier texte, et vous devriez obtenir le contenu du fichier dans la réponse 200.

Téléchargement des données du formulaire

Il s'agit de la méthode de téléchargement la plus populaire/la plus connue pour formater les données que vous envoyez sous forme d'un ensemble de paires clé/valeur. Vous devez normalement spécifier Content-Type À multipart/form-data Dans la demande, puis utiliser l'attribut [FromForm] Dans MVC pour lier des valeurs à des variables. Vous pouvez également utiliser la classe IFormFile intégrée pour accéder au fichier téléchargé.

[HttpPost]
public async Task<IActionResult> PostFormData([FromForm] IFormFile file)
{
    using (var sr = new StreamReader(file.OpenReadStream()))
    {
        var content = await sr.ReadToEndAsync();
        return Ok(content);
    }
}

Téléchargement du corps

Vous pouvez envoyer le corps dans le format que MVC comprend, par ex. JSON et incorporer le fichier à l'intérieur. Normalement, le contenu du fichier serait encodé à l'aide de Base64 ou d'un autre encodage pour éviter les problèmes d'encodage/décodage de caractères, surtout si vous envoyez des images ou des données binaires. Par exemple.

{
    "file": "MTIz"
}

Ensuite, spécifiez [FromBody] Dans votre contrôleur et utilisez la classe pour la désérialisation du modèle.

[HttpPost]
public IActionResult PostBody([FromBody] UploadModel uploadModel)
{
    var bytes = Convert.FromBase64String(uploadModel.File);
    var decodedString = Encoding.UTF8.GetString(bytes);
    return Ok(decodedString);
}
// ...
public class UploadModel
{
    public string File { get; set; }
}

Lorsque vous utilisez des fichiers volumineux et non textuels, la demande JSON devient cependant maladroite et difficile à lire.

fichier binaire

Le point clé ici est que votre fichier est la demande entière . La demande ne contient aucune information supplémentaire pour aider MVC à lier des valeurs à des variables dans votre code. Par conséquent, pour accéder au fichier, vous devez lire Body dans le Request.

[HttpPost]
public async Task<IActionResult> PostBinary()
{
    using (var sr = new StreamReader(Request.Body))
    {
        var body = await sr.ReadToEndAsync();
        return Ok(body);
    }
}
21
Ignas