我需要使用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)?
答案 0 :(得分:1)
我同意Archimedix ...您可以将文件存储在磁盘上,并将其路径存储在MYSQL中作为TEXT字段,而不是将它们作为BLOB放入MySQL中。这样你的检索时间就会很短。如果您有空间意识,那么您可以压缩文档并将其保存在磁盘上,并根据请求解压缩并发送。
<强>更新强>
从您的代码中可以看出,您已经拥有该文件的句柄,并且您可以将其保存在服务器上。 现在为了节省空间,您可以使用默认的java zip实用程序将其压缩。 当两个人上传两个具有相同名称的不同文件时,您可能会遇到问题。要避免这种情况,您可以使用uuid重命名已归档的文档(使用java 6 uuid类),也可以为该文件生成SHA1并将其用于名称。
现在您可以使用存档(和重命名的文件)的绝对路径存储在MySQL中。
表格架构的相反
资源
您可以使用此
资源
所以对于这样的查询: 从表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;
上面的代码假定发生错误时会抛出异常。