web-dev-qa-db-fra.com

Renvoyer le fichier de l'API Web ASP.NET 5

Ma question précédente: Comment renvoyer un fichier depuis l'API Web ASP.net 5

J'essaie de renvoyer un fichier comme réponse de l'API Web POST request.

J'utilise le framework dnx451 et la construction rc1-final. Méthode du contrôleur:

[HttpPost("")]
public ActionResult Post([FromBody]DocumentViewModel vm)
{
    try
    {
        if (ModelState.IsValid)
        {

            var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name);
            var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields);
            var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));
            FileStream stream = new FileStream(file,FileMode.Open);

            return File(stream, "application/pdf", "test.pdf");

        }

    }
    catch (Exception ex)
    {
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return null;
    }
    Response.StatusCode = (int)HttpStatusCode.BadRequest;
    return null;

}

En conséquence, je reçois un fichier avec le nom "réponse". Après l'avoir enregistré au format PDF, j'essaie de l'ouvrir et il indique qu'il est endommagé. J'espère que tu peux m'aider. J'utilise Postman comme client de test.

Merci

10
Joonas Püüa

S'il vous plaît voir ma réponse dans l'autre post: Retourner le fichier comme réponse

Pour référence, je pense que cela correspond à vos besoins:

public FileResult TestDownload()
{
    HttpContext.Response.ContentType = "application/pdf";
    FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes("YOUR PATH TO PDF"), "application/pdf")
    {
        FileDownloadName = "test.pdf"
    };

    return result;                                
}
20
Ian Auty

Il est peut-être préférable de considérer l'utilisation du résultat de l'action FileStreamResult.

Cela présente l'avantage de ne pas nécessiter que l'ensemble du contenu du fichier soit conservé en mémoire ce qui, en fonction de la taille du fichier, du niveau de trafic, etc. pourrait très facilement entraîner des problèmes d'échelle.

Quelque chose comme ça:

[HttpGet]
public FileStreamResult DownloadFile()
{
    var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name);
    var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields);
    var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));
    var stream = new FileStream(file,FileMode.Open);
    return new FileStreamResult(stream, "application/pdf")
    {
        FileDownloadName = "test.pdf"
    };
}
2
Stewart_R