代码之家  ›  专栏  ›  技术社区  ›  Venkat

用MySQL存储和检索word文档

  •  0
  • Venkat  · 技术社区  · 14 年前

    我需要存储和检索MS Word文档到MySQL5.1与servlet。我有上传文件的代码,但我不知道我能不能输入到表中。我已经使用BLOB作为要插入.doc文件的字段。

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

    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();
        }
    }
    

    我的表架构:

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

    有没有人能帮助我如何将文档存储到表中?尽管BLOB是一种表示二进制数据的类型,但如何将其检索为Word文档(*.doc)?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Arc    14 年前

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

        2
  •  1
  •   Favonius    14 年前

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

    更新

    现在为了节省空间,您可以使用默认的javazip实用程序压缩它。 当两个人上载两个同名的不同文件时,您可能会遇到问题。为了避免类似的情况,您可以使用uuid重命名归档文档(使用java6uuid类),或者为该文件生成SHA1并将其用作名称。

    相反 表架构的

    • 用户ID[varchar(15)]

    资源

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

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

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