2010-01-22 24 views
8

這可能聽起來那麼傻,但現實生活中:(如何用JSP提供文件? 。

我可以用一個「虛擬」的鏈接名稱顯示HTML表格的情況下

事情是這樣的:

Xyz description <a href="docId=123">document.doc</a> 

Xyz description <a href="docId=456">documentB.doc</a> 

Xyz description <a href="docId=798">documentC.doc</a> 

此文檔id表示數據庫中的ID(這些文檔都存儲在一個blob的字節[])

不管怎樣,我能得到這個ID,查詢數據庫和檢索的byte [] (甚至將其存儲在tmp文件中)

我不知道該怎麼做,當用戶點擊鏈接(以及執行數據庫檢索後)時,將「byte」[]提供給用戶。

現在是最糟糕的部分,我在這裏問這個問題的是,我只需要使用JSP(沒有servlet)和沒有第三方庫(只是...不要問我爲什麼我討厭它也是)

所以。如何服務於一個jsp的字節數組存儲在服務器文件系統

我的第一個客人的二進制內容是:

<% 
InputStream read // read the file form the fle system 
response.getOutputStream().write(theBytesReader); 
%> 

我是否接近解決?

這會對客戶端工作,就像他真的在服務器上點擊了真實文件一樣嗎?

在此先感謝。

回答

5

至此,只需在JSP中編寫相同的代碼,就像在Servlet class中那樣。你幾乎可以複製粘貼它。只確保你是而不是將任何模板文本寫入流中,這包括腳本之外的換行符和空白。否則,它會被寫入二進制文件並損壞它。

如果您有多個scriptlet塊,則需要對它們進行排列,以便scriptlet的結尾%>與下一個scriptlet的起始<%之間沒有換行符。因此,例如

<%@page import="java.io.InputStream" %><% 
    //... 
%> 

代替

<%@page import="java.io.InputStream" %> 
<% 
    //... 
%> 
+0

按照BalusC的指示將代碼放入JSP文件中,但使用'out.clear();'清除輸出,而不是搞亂頁面格式。 – 2011-10-24 17:35:33

1

事情是這樣的......

InputStream instr = null; 
try { 
    instr = new BufferedInputStream(new FileInputStream("file.txt")); 
    for(int x=instr.read(); x!=-1; x=instr.read()){ 
     out.write(x); 
    } 
} finally { 
    out.close(); 
    if(instr != null) instr.close(); 
} 

您將需要此作爲該點擊(或者在重新加載頁面或者另一個JSP文件)。

有更好的緩衝解決方案,您可以使用字節數組進行寫操作,而不是每次都使用一個緩存解決方案......我將爲您保留這些解決方案。

對不起,你被困在JSP腳本土地...希望這會有所幫助。

+0

您需要設置響應,以及喜歡在我的例子中,MIME類型。 – 2010-01-22 02:22:53

+0

真的......我假設那部分,謝謝澄清雖然。 – cjstehno 2010-01-22 13:14:42

2

除了您提供的示例代碼外,您還需要在下面的HTTP響應中設置MIME類型。

response.setContentType("application/octet-stream"); 

請注意,application/octet-stream MIME類型用於表示二進制文件。

+0

是的,我已經有了,實際上我使用的是:'application/vnd.ms-excel',但我真正的問題是,這個方法會工作嗎? (使用response.out進行讀寫?) – OscarRyz 2010-01-22 02:22:56

+0

是的,只要MIME類型正確,就應該這樣做。 – 2010-01-22 02:23:28

+0

實際上,人們經常這樣做來爲動態圖像提供動態圖像,其中您的圖像URL類似於/foo/bar/yourImage.jsp,它通過返回圖像的字節以及設置圖像/ gif來動態地提供圖像或者類似於內容類型。 – 2010-01-22 02:24:42

2

請,請,請不要這樣做。

你正在對用戶做一些破壞。

HTTP在文件處理方面非常豐富。緩存,組塊,隨機訪問等。

看看像FileServlet這樣的東西,然後敲擊以適應。是的,它是一個Servlet,而不是一個JSP,但這就是你想做一個好的HTTP公民。

一些容器有可以使用其他選項,你可以破解雄貓DefaultServlet等

+0

這不是我的問題的答案,而是一個評論,我知道這可以通過servlet實現,但是如果你閱讀我的問題,這不是一個選項:(對不起,但你的答案沒有幫助 – OscarRyz 2010-01-22 06:57:54

+0

JSP是一個servlet,你幾乎可以將99%的代碼嵌入到你的JSP中並獲得相同的結果。 – 2010-01-22 07:25:19