使用MySQL存储和检索word文档

我需要使用Servlet将MS Word文档存储和检索到MySQL 5.1中。 我有上传文件的代码,但我不知道可以加入表格。 我已经在我要插入.doc文件的字段中使用了BLOB。

这是我上传文件的代码片段:

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("

File : '" + name + "' Type : '" + type + "' " + "of Size : " + ((double) size/1024) + "KB uploaded successfully!

"); } catch(Exception ex) { out.println("Exception -->" + ex.getMessage()); } finally { out.close(); } }

在这里,我使用Servlets 3.0function上传文件…我的表架构:

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

任何人都可以帮助我如何将文档存储到表中虽然BLOB是一种表示二进制数据的类型,但我如何检索Word文档(* .doc)?

关于将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; 

上面的代码假定发生错误时抛出exception。

我同意Archimedix …您可以将文件存储在磁盘上,并将其路径存储在MYSQL中作为TEXT字段,而不是将它们作为BLOB放入MySQL中。 这样您的检索时间就会很短。 如果您有空间意识,那么您可以压缩文档并将其保存在磁盘上,并根据请求解压缩并发送。

UPDATE

从您的代码中可以看出,您已经拥有该文件的句柄,并且您可以将其保存在服务器上。 现在为了节省空间,您可以使用默认的java zip实用程序将其压缩。 当两个人上传两个具有相同名称的不同文件时,您可能会遇到问题。 要避免这种情况,您可以使用uuid重命名归档文档(使用java 6 uuid类),也可以为该文件生成SHA1并将其用于名称。

现在,您可以使用存档(和重命名的文件)的绝对路径存储在MySQL中。

而不是表模式

资源

  • UserID [varchar(15)]
  • 文件[mediumblob]

你可以用它

资源

  • UserID [varchar(15)]
  • 文件[varchar(512)]

所以对于这样的查询:从表格中选择文档文档WHERE UserID =’abcd’;

您现在将获得压缩文件的绝对路径。 解压缩此文件并发送。