2017-10-02 4 views
1

J'ai créé endpoint API Web pour recevoir un fichier zip qui ressemble à ceC# Core 1.1 API Web Recevoir fichier zip

[HttpPut()] 
    [Consumes("application/zip")] 
    public async Task<IActionResult> ImportZip() 
    { 
     var zipFile = HttpContext.Request.Form.Files.FirstOrDefault(); 
     .... 

Et je suis en train de le tester via Postman à cette demande: enter image description here enter image description here

Mais je reçois exception "System.InvalidOperationException: Content-type incorrect: application/zip"

Ce que je fais mal? Merci!

EDIT Demande passe réellement par [Consomme ("application/zip")] attribut, mais s'écraser sur "HttpContext.Request.Form.Files.FirstOrDefault();"

EDIT2 Ok, donc finalement j'ai reçu avec succès un fichier quand je ne mets pas en-tête dans la requête et retiré attribut [Consomme (« application/zip »)]. Dans Request.Form.Files mon dossier ont un type « application/x-zip-compressé » mais quand je suis en train de l'utiliser dans les en-têtes de type contenu et Consomme attribut je reçois même accident System.InvalidOperationException: Incorrect Content-Type: application/x-zip-compressed

+0

Je suis assez shure le type de contenu «application/zip» est inconnu à votre application de base asp.net. Je pense que vous devez télécharger votre fichier zip en tant que 'application/octet-stream'. – NtFreX

+0

@NtFreX - System.InvalidOperationException: Type de contenu incorrect: application/octet-stream –

+0

Je pense que vous devez également définir le type de corps dans le facteur à 'binary'. – NtFreX

Répondre

1

Vous pouvez utiliser IFormFile pour transférer votre Zip *: français. Votre point de terminaison WebAPI doit être mis à jour à ceci:

[HttpPut] 
[Consumes("multipart/form-data")] 
public void Put(IFormFile file) 
{ 
    var stream = file.OpenReadStream(); 
} 

demande Postman devrait ressembler à ceci (vous n'avez pas besoin Content-Type tête comme il se résoudre sur demande):

enter image description here

+1

Merci, @Oluwafemi! Cela fonctionne réellement, et avec cette approche je peux lire un dossier de demande comme je l'ai fait avant ('HttpContext.Request.Form.Files.FirstOrDefault();'). Mais si je comprends bien - tous les fichiers dans la demande seront lus et je veux avoir une restriction seulement pour le zip –

+0

Pouvez-vous s'il vous plaît marquer ma réponse comme la solution. Merci – Oluwafemi

1

postier envoyez multipart/form-data sous la forme Content-Type. Normalement, vous spécifiez uniquement l'attribut Consumes lorsque l'action de l'API Web doit prendre en charge plusieurs types de contenu ou lorsque vous ne souhaitez pas prendre en charge un type de contenu spécifique.

Comme l'action de votre API web dépend de HttpContext.Request.Form.Files, le Content-Type doit être 9 de toute façon.

La meilleure option pour autoriser uniquement les fichiers zip est d'essayer de l'analyser. Si cela échoue, vous savez qu'un mauvais fichier a été téléchargé.

[HttpPut("api/import")] 
public IActionResult ImportZip() 
{ 
    var file = Request.Form.Files.FirstOrDefault(); 
    if (file == null) 
     return BadRequest(); 

    try 
    { 
     using (var zip = new ZipArchive(file.OpenReadStream())) 
     { 
      // do stuff with the zip file 
     } 
    } 
    catch 
    { 
     return BadRequest(); 
    } 

    return Ok(); 
} 

Une autre option serait de vérifier la BOM (Byte order mark) du fichier.