我需要使用 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/