2011-12-21 14 views
18

Chcę, aby przeglądarka pobierze dokument PDF z serwera zamiast otwierania pliku w samej przeglądarce. Używam C#.Wymuszenie przeglądarki, aby pobrać dokument PDF zamiast go otworzyć

Poniżej znajduje się mój przykładowy kod, którego użyłem. To nie działa ..

string filename = "Sample server url"; 
response.redirect(filename); 
+0

Dlaczego nie? Co się dzieje? Jaki jest rzeczywisty URL? – SLaks

+0

@SLaks .. dzięki za odpowiedź..it otwiera się w innej karcie w przeglądarce. nie pobierać. – Arun

Odpowiedz

29

Powinieneś spojrzeć na nagłówek "Content-Disposition"; na przykład ustawienie "Content-Disposition" na "attachment; filename = foo.pdf" poprosi użytkownika (zazwyczaj) za pomocą okna "Save as: foo.pdf" zamiast otwierania go. To jednak musi pochodzić z żądania, które jest pobieranie, więc nie można tego zrobić podczas przekierowania. Jednak ASP.NET oferuje w tym celu Response.TransmitFile. Na przykład (zakładając, że nie używasz MVC, który ma inne preferowane opcje):

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AppendHeader("Content-Disposition", "attachment; filename=foo.pdf"); 
Response.TransmitFile(filePath); 
Response.End(); 
+0

dzięki za odpowiedź ... jeśli podam adres URL zamiast foo.pdf w odpowiedzi ur będzie działać ...? – Arun

+0

@Neon no; w takim przypadku musisz przekazać zawartość; 'TransmitFile' pobiera ścieżkę pliku * lokalnego *, IIRC. –

+0

@Nie trzeba wyjaśniać - jeśli adres URL znajduje się gdzie indziej, możesz działać jako * proxy * dla tego adresu URL; ale nie możesz powiedzieć "idź i odbierz plik od [tam], i traktuj to jako pobieranie" - serwer, który dostarcza ostateczną treść, wybiera typ zawartości i dyspozycję. –

4

Jeśli chcesz renderować plik (i), tak, że można je zapisać na swoim końcu zamiast otwierania w przeglądarce , można spróbować następujący fragment kodu:

Jednakże, jeśli chcesz pobrać plik za pomocą aplikacji klienckiej następnie będziesz musiał użyć WebClient class.

+0

dzięki za odpowiedź ... spróbuję Twojego kodu i powiem moją opinię .. – Arun

+0

Otrzymuję "Argument Out Of Range Exception" podczas wykonywania w linii Response.BinaryWrite (outStream.ToArray()); – Arun

+0

Czy wypełniłeś zawartość w outStream? Czytaj swój plik w strumieniu pamięci i mam nadzieję, że będzie działał dobrze. –

0

Są prawie takie same w większości przypadków, ale istnieje różnica:

Dodaj nagłówek zastąpi poprzedni wpis z tym samym kluczem

Append nagłówku nie zastąpi klucz, a doda kolejny jeden.

2

Używam tego, ustawiając parametr inline na true, pokaże się w przeglądarce false wyświetli okno dialogowe zapisu jako przeglądarki.

public void ExportReport(XtraReport report, string fileName, string fileType, bool inline) 
{ 
    MemoryStream stream = new MemoryStream(); 

    Response.Clear(); 

    if (fileType == "xls") 
     report.ExportToXls(stream); 
    if (fileType == "pdf") 
     report.ExportToPdf(stream); 
    if (fileType == "rtf") 
     report.ExportToRtf(stream); 
    if (fileType == "csv") 
     report.ExportToCsv(stream); 

    Response.ContentType = "application/" + fileType; 
    Response.AddHeader("Accept-Header", stream.Length.ToString()); 
    Response.AddHeader("Content-Disposition", String.Format("{0}; filename={1}.{2}", (inline ? "Inline" : "Attachment"), fileName, fileType)); 
    Response.AddHeader("Content-Length", stream.Length.ToString()); 
    //Response.ContentEncoding = System.Text.Encoding.Default; 
    Response.BinaryWrite(stream.ToArray()); 

    Response.End(); 
} 
Powiązane problemy