2010-01-13 2 views
17

Po prostu chcę, aby ktoś mógł kliknąć link i uzyskać jednorazowy plik pdf. Mamy bibliotekę do tworzenia plików PDF, więc to nie jest problem.Jak mogę zwrócić pdf z żądania internetowego w ASP.NET?

Możemy wygenerować link do strony aspx, wygenerować tę stronę, zapisać plik pdf do systemu plików, a następnie Response.Redirect do zapisanego pliku pdf. Potem musimy jakoś śledzić i czyścić plik PDF.

Ponieważ nie musimy nigdy przechowywać tych danych, zamiast tego chciałbym zamiast tego, jeśli to możliwe, wygenerować plik aspx i przesłać go bezpośrednio jako odpowiedź na pierwotne żądanie . czy to możliwe?

(w naszym przypadku używamy C# i chcemy służyć pdf z powrotem, ale wydaje się, że każde rozwiązanie będzie prawdopodobnie pracować dla różnych języków .NET i wrócił typów plików.)

+0

Dokładny duplikat: http://stackoverflow.com/questions/177/how-do-i-i-programmatically-create-a-pdf-in-my-net-application – RedFilter

+3

Nie duplikuj powyższego w jakimkolwiek znaczeniu. – nothrow

+0

(Wiedziałem, że zamierzam skłonić parę osób, aby zamknęły się jako dupe, wskazując na tego typu pytanie ... dlatego dołączyłem drugie zdanie. Powinienem był zrobić to pierwsze zdanie :)) – Beska

Odpowiedz

30

Zakładając, że można dostać byte[] przedstawiającą PDF:

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", 
    "attachment;filename=\"FileName.pdf\""); 

Response.BinaryWrite(yourPdfAsByteArray); 

Response.Flush(); 

Response.End(); 
+1

To wygląda bardzo obiecująco ... doszedłem do wniosku byłoby to coś w tym stylu, ale nie ma tła, aby poznać szczegóły. Dzięki za odpowiedzi; Spróbuję tego taktu. – Beska

+0

To dokładnie przybrało ten problem. Dzięki! – Beska

+0

Jedno pokrewne pytanie (może powinienem otworzyć oddzielne pytanie, ale jest ściśle związane z tą odpowiedzią ...) Dlaczego Response.Flush()? Kiedy mamy tam tę linię, a ktoś zamyka przeglądarkę po złożeniu zapytania, pojawia się błąd: "Host zdalny zamknął połączenie."Jeśli zostawiamy ten wiersz, nie ma błędu, i wszystko * wydaje się działać." Czytanie dokumentów MSDN nie wyjaśniło mi, czy było to absolutnie konieczne Myślami? – Beska

2

przyjrzeć się, jak HTTP działa. Klient (= przeglądarka) nie polega na rozszerzeniach, chce tylko, aby serwer zwrócił niektóre metadane wraz z dokumentem.

Metadane można dodawać za pomocą narzędzia Response.AddHeader, a jedna "linia metadanych" składa się z nazwy i wartości.

Content-Type to właściwość, którą Państwo interesują, a wartością jest typ MIME danych (badanie: RFC1945 dla nagłówków HTTP, google dla typu MIME).

Dla porządkowych stron aspx (html, ....) właściwość to "text/html" (nie tak banalnie, ale dla tego przykładu wystarczy). Jeśli zwrócisz obraz JPG, może on mieć nazwę "image.gif", ale tak długo jak wysyłasz "image/jpeg" w Content-Type, jest on przetwarzany jako obraz JPG. Typ treści dla pdf to "application/pdf".

Przeglądarka będzie działać zgodnie z domyślnym zachowaniem, na przykład z wtyczką Adobe, wyświetli plik PDF w jego oknie, jeśli nie masz żadnej wtyczki do pliku PDF, powinien pobrać plik itp.

Nagłówek umieszczania treści mówi, co powinieneś zrobić z danymi. Jeśli chcesz, aby klient jawnie "pobierał" trochę HTML/PDF/cokolwiek, a nie wyświetlał go domyślnie, to wartość "załącznik" jest tym, czego potrzebujesz. Powinien mieć inny parametr (zgodnie z sugestią Justina Niessnera), który jest używany w przypadku czegoś podobnego:

http://server/download.aspx?file=11 -> Content-Disposition: załącznik; filename = file.jpg mówi, jak plik powinien być domyślnie o imieniu.

+0

To przydatne informacje. – malckier