我們一直在尋找答案,但尚未找到解決方案。瀏覽器下載完成事件
我們有一個web服務器,它允許用戶下載從servlet動態生成並提供的文件(pdf)。我們想知道下載何時完成(以及如何:是否成功,是否失敗,用戶是否取消了?)。
有沒有辦法知道這個沒有用戶輸入?這些文件相對較小,因此不需要進度條功能,但我們需要某種「掛鉤」,以便在下載完成時進行報告。這可能嗎?
在瀏覽器端會有哪些功能可以檢測下載結束並通過ajax報告回服務器?
我們一直在尋找答案,但尚未找到解決方案。瀏覽器下載完成事件
我們有一個web服務器,它允許用戶下載從servlet動態生成並提供的文件(pdf)。我們想知道下載何時完成(以及如何:是否成功,是否失敗,用戶是否取消了?)。
有沒有辦法知道這個沒有用戶輸入?這些文件相對較小,因此不需要進度條功能,但我們需要某種「掛鉤」,以便在下載完成時進行報告。這可能嗎?
在瀏覽器端會有哪些功能可以檢測下載結束並通過ajax報告回服務器?
除非遇到網絡錯誤,否則無法知道。唯一的方法是讓瀏覽器向服務器發送第二個事件(使用AJAX)來確認下載已成功完成。
即使文件很小,如果您使用setContentLength
方法ServletResponse
,用戶將能夠區分錯誤和良好的下載,並且他們的瀏覽器的下載管理器會告訴他們何時完成。
用戶取消可以有時在一個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)。
穆赫辛
你可以從直接連接到瀏覽器服務器(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查看器,並在顯示時向服務器添加回調。
瀏覽器本身不處理這個,但你可以使用谷歌齒輪來處理下載請求(它會在下載完成時觸發成功事件)。
如果你能在你的文檔中插入圖像領域,圖像HREF可以指向回您的服務器,以確認用戶打開PDF文檔。
我自己沒有嘗試過,但看起來可能是last page of this adobe doc。
如果您使用的是Itext,它不支持圖像字段,但是您可以使用帶有圖像字段的pdf模板來構建文檔並添加javascript以將url分配給圖像字段。
瀏覽器如何知道下載是否成功完成?這實際上是我的問題的要點,我將編輯以使其更清晰 – laura 2009-10-06 09:24:03
爲什麼這個答案被接受?我們仍然不知道如何才能瀏覽器知道下載完成 – abyx 2009-11-02 19:10:19
勞拉,爲什麼你已經授予了這個答案? ) – dnim 2013-10-01 12:33:59