2009-04-17 29 views
7

Tôi có một servlet ghi tệp pdf dưới dạng ByteArrayOutputStream vào luồng đầu ra của servlet. Nếu tôi mở URL servlet, trình duyệt sẽ mở tệp. Nhưng nếu xảy ra lỗi trên servlet, trình duyệt sẽ mở một tệp pdf trống với thông báo lỗi. Gửi lỗi thông qua ServletResponse trình duyệt mở trang lỗi mặc định.Làm cách nào để mở tệp bằng JavaScript?

Tôi muốn gửi thông báo lỗi mà không chuyển hướng đến trang lỗi hoặc mở tệp pdf không hợp lệ.

tôi đã cố gắng:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      docWindow.document.write(response); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

Nhưng, onSuccess mở ra một trang với [đối tượng đối tượng]

Làm thế nào tôi có thể mở một tập tin PDF sử dụng JavaScript?

Trả lời

10

Lưu ý: Tôi giả sử bạn đang sử dụng khuôn khổ thử nghiệm từ Ajax.Request gọi.

response object không có nghĩa là phải được viết trực tiếp, tuy nhiên, có thuộc tính responseText phải chứa tệp PDF trả về.

Các bạn đã thử:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      document.write(response.responseText); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

(Chú ý thêm .responseText)

Edit: Được rồi, vì vậy mà không làm việc ... Hãy thử một cái gì đó như thế này:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      window.open('/pdfservlet'); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

Điều này sẽ làm là tạo yêu cầu ajax và nếu thành công mở nó trong một cửa sổ mới. Việc mở cửa sổ mới sẽ nhanh và không thực sự yêu cầu lại PDF vì trình duyệt nên lưu trong bộ nhớ cache trong suốt cuộc gọi Ajax.Request.

+0

tính năng này không mở ứng dụng pdf. mở một trang với% PDF-1.6 % 1 0 obj <

+1

Tôi đã thêm một giải pháp mới, nó tương tự như những gì rde6173 đề xuất, nhưng dựa trên bộ nhớ đệm của trình duyệt. –

+0

trình duyệt không lưu vào bộ nhớ cache. pdf được yêu cầu hai lần. –

2

Bạn có thể thử phương pháp "hai bước". Bạn sử dụng Ajax để gọi servlet (và nếu nó tạo ra một tập tin PDF trên bay, có nó cache nó). Nếu nó thành công, chuyển hướng người dùng đến servlet với một tham số để tải tệp PDF được lưu trữ.

Có các tùy chọn khác, nhưng tùy thuộc vào cách bạn đang sử dụng tệp PDF.

My $ 0.02 ..

0

Vì có vẻ như bạn đang gửi tệp PDF dưới dạng "nội tuyến" trái ngược với "tệp đính kèm", bạn có thể đặt URL của PDF vào Iframe được tạo động và sau đó đính kèm Iframe đó vào lớp phủ. Rằng sẽ làm việc.

-JP

0

Nhưng nếu xảy ra một lỗi trên servlet, trình duyệt sẽ mở ra một pdf trống với một thông báo lỗi.

Dường như với tôi sẽ tốt hơn nếu bạn cố khắc phục sự cố này ở cuối máy chủ hơn tất cả những điều không mong muốn này với AJAX và cache. Tại sao lỗi servlet vẫn đặt tiêu đề ‘Content-Type: application/pdf’ với thông báo lỗi của nó? Kiểm tra thứ tự gửi những thứ trong servlet; không gửi ‘Loại nội dung’ cho đến khi bạn đã tạo PDF thành công và chuẩn bị sẵn sàng trả lại.

+0

Tôi có thể đặt 'Content-Type: text/xml' nhưng làm cách nào để xử lý điều này ở phía máy khách? –

+0

Làm thế nào về việc chỉ cần đặt nó vào văn bản/html và phục vụ một trang lỗi trông dễ chịu? Sau đó, bạn chỉ có thể liên kết đến tệp và để cho trình duyệt tải xuống hoặc xử lý lỗi. Có thể thích hợp để bao gồm liên kết tải lại "thử lại" nếu đó là loại lỗi có thể biến mất trong lần thử thứ hai. – bobince

+0

Tác phẩm này nhưng tôi không muốn mở trang lỗi. Tôi muốn hiển thị lỗi trong cùng một trang. –

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