2012-08-23 9 views
5

Mam plik ashx z IHttpHandler. Kiedy POST niektóre dane do tego IHttpHandler, wykonuję trochę pracy, tworzę plik, a następnie chcę, aby ten plik został zwrócony do użytkownika, aby mógł zapisać plik za pomocą przeglądarki.Zapisywanie pliku do HttpResponse, przeglądarka nie monituje o zapisanie

Z pliku utworzonego, to jak próbuję zapisać plik z powrotem do odpowiedzi:

HttpResponse response = context.Response; 
response.ClearContent(); 
response.Clear(); 
response.ContentType = "application/octet-stream"; 
response.AddHeader("Content-Disposition", "attachment; filename=MYFILE.EXT"); 
response.WriteFile("C:\tempstuff\MYFILE.EXT"); 

W bloku finally później, wezwę:

response.End() 

Kiedy nazwij to Handler, nic się nie dzieje. Odpowiedź 200 jest zwracana, nie są zgłaszane żadne błędy - ale przeglądarka nie poprosi użytkownika o zapisanie tego pliku.

Oto co odpowiedź, jak schwytany przez Skrzypek, wygląda następująco:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Thu, 23 Aug 2012 12:12:19 GMT 
X-AspNet-Version: 4.0.30319 
Content-Disposition: attachment; filename=MYFILE.EXT 
Cache-Control: private 
Content-Type: application/octet-stream 
Content-Length: 781053 
Connection: Close 

[raw content of the file here] 

Ta odpowiedź wygląda poprawna do mnie. Zawiera zawartość pliku - jednak w żadnej z głównych przeglądarek żadne okno dialogowe pliku nie monituje mnie o zapisanie pliku.

Co ja tu robię źle?

Aktualizacja: Jeśli to pomaga, oto gdzie używam JavaScript z mojej aplikacji internetowej, aby połączyć się z tym HttpHandler.

$.ajax({ 
    type: 'POST', 
     url: ashxUrl, 
     data: postData, 
     success: function (result) { 
      // Doin' stuff on success 
     }, 
     error: function (error) { 
      // Doin' stuff on error. 
     } 
}); 
+0

Próbowałem dokładnie to samo. Zrobiłem prostą stronę 'Download.ashx' z powyższym kodem i POSTed do niej z innej strony,' Default.aspx'. We wszystkich trzech przeglądarkach (IE, FF, Chrome) działa idealnie, a ja dostaję prawie dokładnie te same nagłówki w Fiddler. Nie wiesz, co jeszcze może się dziać? – mellamokb

+0

Interesujące! Być może pomogłoby to w opisaniu mojego JavaScriptu, w którym wyraźnie dokonuję tego wezwania. Będę edytować główny post, aby uwzględnić ten fragment. EDYCJA: dodałem fragment kodu JS. –

+6

Ah. Tak, to pomaga. Nie można zrobić [pobieranie pliku za pośrednictwem AJAX] (http://stackoverflow.com/questions/4814877/how-to-download-file-via-ajax-with-http-post-ie-some-info-in -ciało). Będziesz potrzebować alternatywnego rozwiązania [takiego jak to] (http://stackoverflow.com/questions/3499597/javascript-jquery-to-download-file-via-post-with-json-data). – mellamokb

Odpowiedz

2

Powiedziałeś, że chcesz, aby wyniki połączenia internetowego były dostępne dla twojego javascript. Byłoby bardzo denerwujące, gdyby to spowodowało, że przeglądarka monituje o zapisanie, ponieważ wtedy cała AJAX byłaby niemożliwa.

Chcesz, aby sama przeglądarka nawiązała połączenie. Aby uzyskać GET, będzie to prosta sprawa z ustawieniem self.location.href. W przypadku testu POST najłatwiej jest zwykle wypełnić ukryty formularz danymi, a następnie submit().

Powiązane problemy