2016-01-18 34 views
9

Moje poprzednie pytanie: How to return file from ASP.net 5 web apiPowrót plik z ASP.NET Web API 5

Staram się zwracać, jak plik odpowiedzi od żądania POST Web API.

Używam frameworków dnx451 i kompilacji rc1-final. Metoda kontrolera:

W rezultacie otrzymuję plik z nazwą "odpowiedź". Po zapisaniu go jako pliku pdf próbuję go otworzyć i jest napisane, że jest uszkodzony. Mam nadzieję, że możesz mi pomóc. Używam Postmana jako klienta testowego.

Dzięki

+0

Podczas debugowania tego, czy kod osiągnie 'return File()' wiersza? Jaka jest treść i nagłówki otrzymane w odpowiedzi? – David

+0

Czy twoja linia 'Helper.GeneratePdf()' działa poprawnie? Jaka jest wartość 'file'? Czy plik może zostać otwarty i czy sprawdziłeś wygenerowany plik przed wysłaniem go do przeglądarki? –

+0

tak, generowany jest plik pdf i mogę otworzyć wygenerowany plik pdf z eksploratora plików i wszystko jest w porządku. –

Odpowiedz

18

proszę zobaczyć moją odpowiedź w innym poście: Return file as response

Dla porównania, myślę, że to pasuje do Twoich potrzeb:

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;         
} 
+0

Wynik jest wciąż taki sam. Odpowiedź zwraca plik o nazwie "odpowiedź". jeśli zmienię nazwę na somthing.pdf i spróbuję ją otworzyć - nadal jest uszkodzona. –

+0

Przetestowałem ten kod lokalnie z lokalnym plikiem pdf i plikiem pobranym poprawnie i mogłem go otworzyć. Czy ścieżka do pliku pdf jest lokalna na twoim komputerze, czy też generujesz ją dynamicznie, czy coś w tym stylu? Tam, gdzie napisałem "TWOJA ŚCIEŻKA DO PDF", należy również podać rozszerzenie. –

+0

zasadniczo ja tworzę, ale atm testuję z lokalnym plikiem. tak .pdf jest włączone. Myślę, że może to być problem PostMana. –

9

Właśnie miał ten problem i znaleźć rozwiązanie. Tak długo, jak masz absolutną ścieżkę do pliku, a następnie można powrócić do PhysicalFileResult i jawnie ustawić nagłówek Content-Disposition na Response, tak:

[HttpGet("{key}")] 
public IActionResult Get(string key) 
{ 
    var file = _files.GetPath(key); 

    var result = PhysicalFile(file.Path, "text/text"); 

    Response.Headers["Content-Disposition"] = new ContentDispositionHeaderValue("attachment") 
    { 
     FileName = file.Name 
    }.ToString(); 

    return result; 
} 

Korzystanie PhysicalFile ma również tę zaletę, że wszystkie asynchroniczny streaming bajty i tym podobne są obsługiwane przez framework.

3

Być może lepiej jest rozważyć użycie rezultatu działania FileStreamResult.

Ma to tę zaletę, że nie wymaga przechowywania w pamięci całej zawartości pliku, co w zależności od wielkości pliku, poziomu natężenia ruchu itp. Może bardzo łatwo doprowadzić do problemów z wagą.

coś takiego:

[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" 
    }; 
} 
+0

Isnt FileStreamResult od MVC? – Tobias