使用MySQL存储和检索word文档

时间:2010-09-27 06:04:04

标签: java mysql servlets file-upload

我需要使用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("<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();
    }
}

在这里,我使用Servlets 3.0功能上传文件... 我的表架构:

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

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

2 个答案:

答案 0 :(得分:1)

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

<强>更新

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

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

表格架构的

相反

资源

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

您可以使用此

资源

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

所以对于这样的查询: 从表Documents WHERE UserID ='abcd';

中选择Document

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

答案 1 :(得分: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;

上面的代码假定发生错误时会抛出异常。