2014-09-24 72 views
1

我有一個鏈接到一個img如何在IE 9及以上版本的jsp中強制下載html/javascript?

<a href="relative_Path_of_IMG">Save</a> 

,我需要這個鏈接使這個文件的直接下載。 在Chrome和Firefox的正常工作與屬性「下載」

<a href="relative_Path_of_IMG" download>Save</a> 

但也就是這並不正常工作。 我有互聯網的JS COMAND window.document.execCommand上找到的,我嘗試在這條路上

window.document.execCommand('SaveAs', true, fileName || fileURL) 

使用,但這種方式打開一個窗口,用戶選擇一個文件夾保存,我需要的是下載在用戶下載的默認文件夾上執行automaticaly,如Chrome和Firefox上的屬性下載。

感謝

保羅·菲利佩

+0

因此,從正確的標題的服務器端迫使它。 – epascarello 2014-09-24 13:06:19

+1

與文件一起發送的Content-Disposition標頭是什麼?該標題用於告訴瀏覽器如何處理下載的內容。 (當然,瀏覽器仍然可以配置爲忽略它並執行一些其他操作,但不能從服務器控制它)。 – David 2014-09-24 13:07:43

+0

我已經指出用戶點擊鏈接'保存'並且只開始下載沒有窗戶詢問該文件夾,並沒有重新加載的頁面 – 2014-09-24 13:19:12

回答

0

您可以創建一個JSP並將其用作servlet。它會通過參數鏈接您想要下載的圖像的網址。

這個servlet將打開一個流來讀取文件和其他流以在瀏覽器上寫輸出。有了這個你的瀏覽器將負責處理你的文件。

請按照此JSP的示例進行操作。

<%@ page language="java" contentType="image/jpeg; charset=UTF-8" pageEncoding="UTF-8"%> 
<% 
String urlPrefix = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort(); 

String fileUrl = request.getParameter("fileUrl"); 
if (fileUrl == null || "".equals(fileUrl.trim())) { 
    throw new Exception("No image Found."); 
} 

String fileName = fileUrl.substring(fileUrl.lastIndexOf("/")+1); 

response.setContentType("image/jpeg"); 
response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileName, "UTF-8")); 

String fullEncodedUrl = urlPrefix + URIUtil.encodePath(fileUrl); 

URL url = new URL(fullEncodedUrl); 

URLConnection connection = url.openConnection(); 
InputStream stream = connection.getInputStream(); 

BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); 
int len; 
byte[] buf = new byte[1024]; 
while ((len = stream.read(buf)) > 0) { 
    outs.write(buf, 0, len); 
} 
outs.close(); 
%> 
+1

謝謝,這解決了我的問題。 – 2014-09-25 17:02:47

0

用戶應該得到的地方保存文件選擇。它的唯一公平的,因爲下載到他們的機器。

在Chrome和Firefox中,設置中有一個選項(在Firefox中)默認爲始終將文件保存到Downloads文件夾。用戶選擇始終保存到相同的文件夾,而不更改該設置。他們可以輕鬆更改下一個設置,說「總是問我在哪裏保存文件。」但他們選擇,而不是網站。如果微軟有類似的選擇,用戶可以選擇它,但你(即任何服務器端代碼)不能。

相關問題