2010-09-27 54 views
0

我需要使用Servlets將MS Word文檔存儲和檢索到MySQL 5.1中。我有上傳文件的代碼,但是我不知道我可以輸入表格。我已經使用BLOB來填充我要插入.doc文件的字段。使用MySQL存儲和檢索Word文檔

這裏是我的代碼片段上傳文件:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException { 
    response.setContentType("text/html;charset=UTF-8"); 
    PrintWriter out = response.getWriter(); 
    try { 
     // get access to file that is uploaded from client 
     Part p1 = request.getPart("file"); 
     String type=p1.getContentType(); 
     String name=p1.getName(); 
     long size = p1.getSize(); 
     InputStream is = p1.getInputStream(); 
     //FileInputStream fis = is. 

     // read filename which is sent as a part 
     Part p2 = request.getPart("name"); 
     Scanner s = new Scanner(p2.getInputStream()); 
     String filename = s.nextLine(); // read filename from stream 

     // get filename to use on the server 
     String outputfile = this.getServletContext().getRealPath(filename); // get path on the server 
     FileOutputStream os = new FileOutputStream (outputfile); 

     // write bytes taken from uploaded file to target file 
     int ch = is.read(); 
     while (ch != -1) { 
      os.write(ch); 
      ch = is.read(); 
     } 
     os.close(); 
     out.println("<h3>File : '" + name + "' Type : '" + type + "' " 
       + "of Size : " + ((double) size/1024) + "KB uploaded successfully!</h3>"); 
    } 
    catch(Exception ex) { 
     out.println("Exception -->" + ex.getMessage()); 
    } 
    finally { 
     out.close(); 
    } 
} 

在這裏,我使用的Servlet 3.0功能上傳文件... 我的表模式:

resources 
    - UserID [varchar(15)] 
    - Document [mediumblob] 

任何人都可以幫助我該如何將文檔存儲到表中,儘管BLOB是一種表示二進制數據的類型,我如何才能以Word文檔(* .doc)的形式檢索?

+1

也許你以前已經聽說過這個問題,但是......是否強制將整個文檔存儲在數據庫中而不是常規文件中?爲此使用MySQL可能會比較慢,並且您可能遇到非常大的文檔問題(例如,如果超過max_allowed_pa​​cket)。 http://dev.mysql.com/doc/refman/5.1/en/program-variables.html – Archimedix 2010-09-27 06:21:49

回答

0

上存儲文件的Word文檔的部分答案:
你不需要任何額外的列來保存文件名作爲文件的記錄ID可以作爲文件名。

保存新文檔時,請在數據庫事務中進行操作,以便在出現問題時撤消該過程。

在僞代碼中,這將是這樣的:

begin transaction; 

try { 
    save new record for document; 
    save Word document in predefined directory, using record's ID as the filename; 
} catch (Exception e) { 
    rollback transaction; 
    throw e; // Rethrow exception 
} 

commit transaction; 

上面的代碼假定在發生錯誤時則拋出異常。

1

我同意Archimedix ...而不是將它們放入MySQL作爲BLOB,您可以將文件存儲在磁盤上,並將其路徑存儲在MYSQL中作爲TEXT字段。這樣你的檢索時間會很短。如果你有空間意識,那麼你可以壓縮文檔並將其保存在磁盤上,並根據請求解壓縮併發送。

UPDATE

從你的代碼看來,你已經擁有的文件句柄,你可以將其保存在服務器上。 現在爲了節省空間,您可以使用默認的Java zip實用程序對其進行壓縮。 當兩個人上傳兩個具有相同名稱的不同文件時,您可能會遇到問題。爲避免這種情況,您可以使用uuid(使用java 6 uuid類)重命名歸檔文檔,也可以爲該文件生成SHA1並將其用於名稱。

現在您可以使用存檔(和重命名文件)的絕對路徑來存儲在MySQL中。

相反表架構的

資源

  • 用戶名[VARCHAR(15)
  • 文獻[MEDIUMBLOB]

您可以使用本

個資源

  • 用戶ID [VARCHAR(15)]
  • 文獻[VARCHAR(512)]

因此,對於這樣的查詢: 從表文件選擇文檔WHERE用戶ID =' A B C D';

您現在將獲得壓縮文件的絕對路徑。解壓縮該文件併發送。

+0

Thanx bro ..但我不知道如何組織物理存儲文件和路徑在MySQL表格?你有任何示例代碼片段,以便我能更好地理解... – Venkat 2010-09-27 08:25:12

+0

不客氣。 – Favonius 2010-09-27 08:57:28

+0

我現在沒有工作代碼。但檢查我更新的答案。希望這會幫助你。 – Favonius 2010-09-27 09:10:11