2015-01-06 117 views
1

我在服務器中有一個zip文件。我想點擊鏈接下載該文件。鏈接下載JSF中的zip文件

有沒有辦法創建一個鏈接來下載JSF或PrimeFaces的zip文件,如下面的客戶端HTML5 download屬性?

<a href="/images/myw3schoolsimage.jpg" download> 
+0

爲了您的知識,採取'P A的樣子:fileDownload',它可以幫助你一天:http://www.primefaces.org/showcase/ui/file /download.xhtml – Pellizon

+0

@Pellizon:只有在磁盤上沒有具體文件時纔有用,但在JSF託管bean中只有'InputStream'或'byte []'。 – BalusC

回答

6

HTML5 download屬性與它無關。它只是允許你指定一個替代文件名,它應該出現在另存爲對話框中。

E.g.

<a href="foo.zip" download="bar.zip" /> 

將顯示另存爲bar.zip作爲文件名對話框,但實際上提供的foo.zip內容。請注意,bar.zip不一定需要存在於服務器中。


至於您的具體問題,有幾種方法可以在JSF Web應用程序中提供文件下載。

  1. 只需將該文件放入公共Web內容文件夾即可。

    WebContent 
    |-- META-INF 
    |-- WEB-INF 
    |-- files 
    | `-- foo.zip 
    |-- page.xhtml 
    : 
    

    然後,你可以參考它:

    <a href="#{request.contextPath}/files/foo.zip">download foo.zip</a> 
    
  2. 或者,如果它是一個外部文件夾,您無法將其遷移到公共網頁內容,然後就告訴服務器發佈。例如。當你有/path/to/files路徑和您正在使用Tomcat服務器所有這些文件,然後添加以下到Tomcat的/conf/server.xml<Host>元素:

    <Context docBase="/path/to/files" path="/files" /> 
    

    然後,你可以參考它:

    <a href="/files/foo.zip">download foo.zip</a> 
    
  3. 或者,如果您無法控制服務器配置,或者無法確定將任意文件夾發佈爲新的Web上下文的特定於服務器的方式,還是代表您不希望發佈到Web中的臨時存儲文件夾,然後創建一個可以完成這項工作的web servlet。離開緩存和恢復之外的考慮,它是那樣簡單:

    <a href="#{request.contextPath}/files/foo.zip">download foo.zip</a> 
    
2

儘管這是一個老問題,我想:

@WebServlet("/files/*") 
public class FileServlet extends HttpServlet { 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String filename = request.getPathInfo().substring(1); 
     File file = new File("/path/to/files", filename); 
     response.setHeader("Content-Type", getServletContext().getMimetype(filename)); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 
     response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); 
     Files.copy(file.toPath(), response.getOutputStream()); 
    } 

} 

你可以參考它作爲#1的相同方式將其添加到@ BalusC的答案完整性(由於低信譽導致的評論):@BalusC(帶有@WebServlet)的第三種解決方案可能導致'路徑遍歷攻擊',如果複製粘貼。

您可以使用URL嘗試攻擊(對於Linux服務器):

<yourApplicationURLUntilContextPath>/files/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/%C0%AE/etc/passwd 

對於這個問題的各種解決方案。其中之一是,將文件複製到輸出流之前添加下面的檢查:

if(!file.getAbsolutePath().equals(file.getCanonicalPath())) 
{ 
response.sendError(404); 
} 

你可以參考的link更多的解決方案,路徑遍歷攻擊。

希望它可以幫助開發者的...