【问题标题】:Store and retrieve word documents with MySQL使用 MySQL 存储和检索 word 文档
【发布时间】:2011-04-17 14:49:02
【问题描述】:

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

这是我上传文件的代码 sn-p:

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)?

【问题讨论】:

  • 也许您之前已经听说过这个问题,但是……您是否必须将整个文档存储在数据库中而不是常规文件中?为此使用 MySQL 可能会更慢,并且您可能会遇到非常大的文档的问题(例如,如果超过了 max_allowed_pa​​cket)。 dev.mysql.com/doc/refman/5.1/en/program-variables.html

标签: java mysql servlets file-upload


【解决方案1】:

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

更新

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

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

代替表架构

资源

  • 用户 ID [varchar(15)]
  • 文档 [mediumblob]

你可以使用这个

资源

  • 用户 ID [varchar(15)]
  • 文档 [varchar(512)]

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

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

【讨论】:

  • 谢谢兄弟.. 但我不知道如何组织物理存储文件并在 MySQL 表中拥有路径?有没有示例代码sn-p,让我更好的理解...
  • 我现在没有工作代码。但请检查我更新的答案。希望这会对你有所帮助。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2023-03-12
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多