java - 使用 MySQL 存储和检索 Word 文档

标签 java mysql servlets file-upload

我需要使用 Servlet 在 MySQL 5.1 中存储和检索 MS Word 文档。我有上传文件的代码,但我不知道是否可以将其输入到表格中。我在要插入 .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) 形式检索?

最佳答案

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

更新

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

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

代替表架构

资源

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

您可以使用此

资源

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

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

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

关于java - 使用 MySQL 存储和检索 Word 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3801438/

相关文章:

java - 使用功能分支进行 Gradle 依赖管理

java - hibernate 。一张表中有多个外键

java - 如何使用 HAPI 解析 HL7 中的多个 OBR 段

java - 使用 Java 在 OpenCL 上运行 C 应用程序 - 可能吗?

php - xampp codeigniter 项目中的空白页面加载

mysql - 根据特定值选择行组合

mysql - 选择查询中的逻辑错误

java - 如何控制Apache Tomcat开启的线程数

java - 使用select和option标签在jsp中插入数据

java - 将生成的 REST 服务接口(interface)实现绑定(bind)到 servlet