2010-09-27 55 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