2009-10-06 24 views
7

Szukaliśmy odpowiedzi na to pytanie, ale nie znaleźliśmy rozwiązania.Zakończ wydarzenie pobierania przeglądarki

Mamy serwer internetowy, który pozwala użytkownikowi na pobieranie plików (pdf), które są generowane dynamicznie i podawane z serwletów. Chcielibyśmy wiedzieć, kiedy pobieranie zostało zakończone (i jak: czy odniosło sukces, czy się nie udało, czy użytkownik anulował?).

Czy można to poznać bez wprowadzania danych przez użytkownika? Pliki te są względnie małe, więc nie jest wymagana żadna funkcja paska postępu, ale potrzebujemy jakiegoś "haka końcowego", który zgłasza się po zakończeniu pobierania. czy to możliwe?

[edytuj] Jakie możliwości miałaby strona po stronie przeglądarki, która może wykryć koniec pobierania i zgłosić się do serwera za pośrednictwem ajax?

Odpowiedz

3

Jeśli nie dostaniesz błędu sieci, nie możesz o tym wiedzieć. Jedynym sposobem jest wysłanie przez przeglądarkę drugiego zdarzenia do serwera (przy użyciu AJAX), aby potwierdzić, że pobieranie zostało zakończone pomyślnie.

+2

W jaki sposób przeglądarka wiedziałaby, czy pobieranie zostało zakończone pomyślnie? To było istotą mojego pytania, więc zmienię je, aby były jaśniejsze. – laura

+9

Dlaczego ta odpowiedź została przyjęta? Nadal nie wiemy, w jaki sposób przeglądarka może wiedzieć, że pobieranie zostało zakończone. – abyx

+0

laura, dlaczego przyznano Ci tę odpowiedź?) – dnim

1

Mimo że pliki są małe, jeśli użyjesz metody setContentLength z ServletResponse, użytkownik będzie w stanie rozróżnić między błędem a dobrym pobieraniem, a menedżer pobierania przeglądarki ich przeglądarki powie im, kiedy jest kompletny.

2

Anulowanie użytkownika może zostać wykryte w serwlecie jako , czasem. Używając na przykład Tomcat, spróbuj przesłać duży plik do klienta, a następnie anuluj pobieranie. Możesz zobaczyć stacktrace wyjątku w logs/catalona.out. Nie jestem jednak pewien, czy można to zrobić w samym serwletzie lub na niższym poziomie (wewnątrz catalina).

Istnieje metoda wstępnego ładowania (na pewno z obiektem nasłuchującym zdarzenia obiekt) zwykle używanym do pobierania obrazów. Przeglądarka pobiera cały plik PDF, jeśli wykryje go jako nieobsługiwany obraz, ale warto spróbować. Here jest przykładem.

Innym rozwiązaniem byłoby niejawnie pobrać plik PDF za pomocą znaczników <object> lub <embed> i za pomocą ich odbiornika zdarzeń onload. Nie znaczy to, że działa tylko wtedy, gdy ActiveX lub jakieś powiązanie plików PDF jest wykonane w przeglądarce i prawdopodobnie nie będzie działać, jeśli użytkownik nie ma przeglądarki PDF. Here jest przykładem demonstrującym to (patrz rozwiązanie wspomagane: 11/21/04 08:22, ID: 12638846).

Mohsen

6

można uzyskać całkiem dobry pomysł z serwera, który jest podłączony bezpośrednio do przeglądarki (punkt końcowy połączenia TCP). Serwer otrzyma błąd IO, gdy użytkownik anuluje pobieranie lub napotka jakiś problem z siecią. Więc jeśli możesz uruchomić serwer bezpośrednio (bez serwerów proxy). Można zrobić coś takiego,

try { 
     response.setContentType("application/pdf"); 
     response.setContentLength(bytes.length); 
     ServletOutputStream ouputStream = response.getOutputStream(); 
     ouputStream.write(bytes, 0, bytes.length); 
     ouputStream.flush(); 
     ouputStream.close(); 
     logger.info("PDF " + fileName + " sent successfully"); 
    } catch (Exception e) { 
     logger.error("PDF " + fileName + " error: " + e.getMessage()); 
     throw e; 
    } 

Jednak wciąż istnieje niewielka szansa, że ​​użytkownik nie może zobaczyć PDF w przeglądarce po pomyślnym pobrania. Najlepszym rozwiązaniem będzie ACK z przeglądarki. Nie można tego zrobić, jeśli plik PDF jest wyświetlany bezpośrednio w przeglądarce. Musisz użyć jakiejś przeglądarki Javascript PDF i dodać połączenie z powrotem do serwera, gdy jest ono wyświetlane.

0

Jeśli można wstawić pole graficzne w dokumentach, href obraz może wskazywać z powrotem na serwer w celu potwierdzenia, że ​​użytkownik otworzył dokument pdf.

Nie próbowałem tego sam, ale patrząc na last page of this adobe doc wydaje się możliwe.

Jeśli używasz Itext, to nie obsługuje pól obrazu, ale możesz użyć szablonu pdf z polem obrazu, aby zbudować dokumenty i dodać javascript, aby przypisać adres URL do pola obrazu.

Powiązane problemy