2009-10-06 166 views
7

我們一直在尋找答案,但尚未找到解決方案。瀏覽器下載完成事件

我們有一個web服務器,它允許用戶下載從servlet動態生成並提供的文件(pdf)。我們想知道下載何時完成(以及如何:是否成功,是否失敗,用戶是否取消了?)。

有沒有辦法知道這個沒有用戶輸入?這些文件相對較小,因此不需要進度條功能,但我們需要某種「掛鉤」,以便在下載完成時進行報告。這可能嗎?

在瀏覽器端會有哪些功能可以檢測下載結束並通過ajax報告回服務器?

回答

3

除非遇到網絡錯誤,否則無法知道。唯一的方法是讓瀏覽器向服務器發送第二個事件(使用AJAX)來確認下載已成功完成。

+2

瀏覽器如何知道下載是否成功完成?這實際上是我的問題的要點,我將編輯以使其更清晰 – laura 2009-10-06 09:24:03

+9

爲什麼這個答案被接受?我們仍然不知道如何才能瀏覽器知道下載完成 – abyx 2009-11-02 19:10:19

+0

勞拉,爲什麼你已經授予了這個答案? ) – dnim 2013-10-01 12:33:59

1

即使文件很小,如果您使用setContentLength方法ServletResponse,用戶將能夠區分錯誤和良好的下載,並且他們的瀏覽器的下載管理器會告訴他們何時完成。

2

用戶取消可以有時在一個servlet中被檢測到。例如,使用Tomcat嘗試將大文件傳輸到客戶端,然後取消下載。您可以在logs/catalona.out中看到異常的堆棧跟蹤。然而,我不確定這可以在servlet本身或較低級別(在catalina內)進行處理。

有一種預加載的方法(肯定與事件監聽器設施)通常用於下載圖像。如果瀏覽器檢測到它是不受支持的圖像,它將由瀏覽器下載整個PDF,但它值得一試。 Here就是一個例子。

另一種解決方案是隱式地使用<object><embed>標籤下載PDF並使用它們的onload事件偵聽器。這並不是說,只有在瀏覽器中完成ActiveX或某種PDF文件關聯時纔有效,如果用戶沒有PDF查看器,則可能不起作用。 Here就是一個證明這一點的例子(見輔助解決方案:11/21/04 08:22 AM,ID:12638846)。

穆赫辛

6

你可以從直接連接到瀏覽器服務器(TCP連接的端點)一個不錯的主意。當用戶取消下載或遇到任何網絡問題時,服務器將發生IO錯誤。所以如果你可以直接運行服務器(沒有代理服務器)。你可以做這樣的事情,

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

然而,仍有少數情況下,用戶可能不會看到在瀏覽器中的PDF下載成功後。來自瀏覽器的ACK將是最佳方法。如果PDF直接通過瀏覽器顯示,則不能這樣做。您必須使用某種Javascript PDF查看器,並在顯示時向服務器添加回調。

0

如果你能在你的文檔中插入圖像領域,圖像HREF可以指向回您的服務器,以確認用戶打開PDF文檔。

我自己沒有嘗試過,但看起來可能是last page of this adobe doc

如果您使用的是Itext,它不支持圖像字段,但是您可以使用帶有圖像字段的pdf模板來構建文檔並添加javascript以將url分配給圖像字段。