2009-10-06 34 views
7

Chúng tôi đã tìm kiếm một lúc để có câu trả lời cho điều này, nhưng chưa tìm thấy giải pháp nào.Trình duyệt tải xuống sự kiện hoàn chỉnh

Chúng tôi có máy chủ web, cho phép người dùng tải xuống tệp (pdf), được tạo động và được phân phối từ servlets. Chúng tôi muốn biết thời điểm tải xuống đã hoàn tất (và cách: thành công, đã thất bại, người dùng có hủy không?).

Có cách nào để biết điều này mà không cần nhập của người dùng không? Những tệp này tương đối nhỏ nên không có chức năng thanh tiến trình là cần thiết, nhưng chúng tôi cần một số loại "móc nối" báo cáo lại khi quá trình tải xuống hoàn tất. Điều này có thể không?

[sửa] Khả năng nào ở phía trình duyệt có thể phát hiện kết thúc tải xuống và báo cáo lại cho máy chủ qua ajax?

Trả lời

3

Trừ khi bạn gặp lỗi mạng, bạn không thể biết. Cách duy nhất là để trình duyệt gửi một sự kiện thứ hai tới máy chủ (sử dụng AJAX) để xác nhận việc tải xuống đã được hoàn tất thành công.

+2

Trình duyệt sẽ biết liệu quá trình tải xuống có hoàn tất thành công hay không? Đó là ý chính của câu hỏi của tôi trong thực tế, tôi sẽ chỉnh sửa để làm cho nó rõ ràng hơn – laura

+9

Tại sao câu trả lời này được chấp nhận? Chúng tôi vẫn không biết làm cách nào để trình duyệt biết tải xuống được hoàn tất – abyx

+0

laura, tại sao bạn lại nhận được câu trả lời này?) – dnim

1

Mặc dù các tập tin nhỏ, nếu bạn sử dụng phương pháp setContentLength của ServletResponse người dùng sẽ có thể phân biệt giữa một lỗi và một download tốt, và quản lý tải xuống trình duyệt của họ sẽ nói với họ khi nó hoàn tất.

2

Hủy người dùng có thể đôi khi được phát hiện trong một servlet. Sử dụng Tomcat chẳng hạn, cố gắng truyền một tập tin lớn đến máy khách, và sau đó hủy tải xuống. Bạn có thể thấy stacktrace của ngoại lệ trong nhật ký/catalona.out. Tôi không chắc chắn, tuy nhiên, điều này có thể được xử lý trong servlet chính nó hoặc một mức độ thấp hơn (bên trong catalina).

Có phương pháp tải trước (chắc chắn với trình xử lý sự kiện cơ sở) thường được sử dụng để tải xuống hình ảnh. Trình duyệt có tải xuống toàn bộ PDF hay không nếu nó phát hiện ra nó là một hình ảnh không được hỗ trợ, nhưng nó đáng để thử. Here là một ví dụ.

Một giải pháp khác là tải xuống tệp PDF hoàn toàn bằng cách sử dụng các thẻ <object> hoặc <embed> và sử dụng trình xử lý sự kiện onload của chúng. Không phải là điều này chỉ hoạt động nếu một kết hợp tệp ActiveX hoặc một số tệp PDF được thực hiện trong trình duyệt và có thể sẽ không hoạt động nếu người dùng không có trình xem PDF. Here là ví dụ minh họa điều này (xem giải pháp được hỗ trợ: 11/21/04 08:22 SA, ID: 12638846).

Mohsen

6

Bạn có thể nhận được một ý tưởng khá hay từ máy chủ được kết nối trực tiếp với trình duyệt (điểm cuối của kết nối TCP). Máy chủ sẽ nhận được lỗi IO khi người dùng hủy tải xuống hoặc gặp phải bất kỳ sự cố mạng nào. Vì vậy, nếu bạn có thể chạy máy chủ trực tiếp (không có proxy). Bạn có thể làm một cái gì đó như thế này,

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

Tuy nhiên, vẫn có một cơ hội nhỏ mà người dùng không thể nhìn thấy PDF trong trình duyệt sau khi tải xuống thành công. ACK từ trình duyệt sẽ là cách tiếp cận tốt nhất. Bạn không thể làm điều đó nếu PDF được trình duyệt trực tiếp hiển thị. Bạn phải sử dụng một số loại trình xem PDF Javascript và thêm một cuộc gọi trở lại máy chủ khi nó được hiển thị.

1

Trình duyệt nguyên bản không xử lý việc này nhưng bạn có thể sử dụng google gears để xử lý yêu cầu tải xuống (nó sẽ kích hoạt sự kiện thành công khi quá trình tải xuống hoàn tất).

http://code.google.com/apis/gears/api_httprequest.html

0

Nếu bạn có thể chèn một lĩnh vực hình ảnh trong tài liệu của bạn, hình ảnh href thể chỉ trở lại máy chủ của bạn để xác nhận rằng người dùng đã mở tài liệu pdf.

Tôi chưa thử điều này nhưng nhìn vào last page of this adobe doc có vẻ như có thể.

Nếu bạn đang sử dụng Itext, nó không hỗ trợ các trường hình ảnh, nhưng bạn có thể sử dụng mẫu pdf với trường hình ảnh để tạo tài liệu và thêm javascript để gán url cho trường hình ảnh.

Các vấn đề liên quan