我正在开发一个基于Spring和Hibernate的应用程序。我在从blob字段(MySql数据库)中检索内容时遇到了一些问题。我有两种情况:
1。场景直接在数据库表中上传文档,该文档映射到实体类。我为此目的使用以下代码:
//来自控制器的代码
@RequestMapping(value = "/save", method = RequestMethod.POST)
public String save(@ModelAttribute("baseTemplate") BaseTemplateEntity baseTemplate,
@RequestParam("file") MultipartFile file) throws SerialException, SQLException {
String partName = baseTemplate.getPartName();
String asil = baseTemplate.getAsil();
try {
Blob blob = new javax.sql.rowset.serial.SerialBlob(IOUtils.toByteArray(file.getInputStream()));
baseTemplate.setFileName(file.getOriginalFilename());
baseTemplate.setContent(blob);
baseTemplate.setContentType(file.getContentType());
} catch (IOException e) {
e.printStackTrace();
}
try {
baseTemplateManager.save(baseTemplate);
logger.info("Document is saved successfully");
} catch(Exception e) {
e.printStackTrace();
}
return "redirect:/baseTemplates";
}
来自dao的代码
@Override
public void save(BaseTemplateEntity template) {
this.sessionFactory.getCurrentSession().save(template);
}
借助上述代码,我可以在数据库中上传.xls文档。
2。场景我在数据库表中上传文档,该表未映射到任何实体类。这意味着我正在动态创建数据库表。
//来自控制器的代码
@RequestMapping(value = "/viewItemDocument/*/saveItemSafetyPlanTemplate", method = RequestMethod.POST)
public String saveItemSaeftyPlanDocument(@ModelAttribute("itemTemplate") ItemSafetyDocumentEntity itemTemplate,
@RequestParam("file") MultipartFile file) throws SerialException, SQLException {
String partName = itemTemplate.getPartName();
String asil = itemTemplate.getAsil();
String itemName = itemTemplate.getItem();
try {
Blob blob = new javax.sql.rowset.serial.SerialBlob(IOUtils.toByteArray(file.getInputStream()));
itemTemplate.setFileName(file.getOriginalFilename());
itemTemplate.setContent(blob);
itemTemplate.setContentType(file.getContentType());
} catch (IOException e) {
e.printStackTrace();
}
try {
//Saving the edited/new document
itemSafetyDocumentManager.saveItemEditedDocument(itemTemplate);
logger.info("Document is saved successfully");
} catch(Exception e) {
e.printStackTrace();
}
String tableName = itemName.toString().replace(" ", "")+"SafetyPlan";
return "redirect:/viewItemDocument/"+tableName+"/"+itemName+"";
}
//来自dao的代码
@Override
public void saveItemEditedDocument(ItemSafetyDocumentEntity template) {
String tableName = template.getItem().toString().replace(" ", "")+"SafetyPlan";
String createTable = "create table IF NOT EXISTS "+tableName;
String query2 = createTable +"(ID int(11) primary key NOT NULL UNIQUE AUTO_INCREMENT,Item varchar(255),Asil varchar(20),PartName varchar(255),Template longblob NOT NULL, ContentType varchar(255), FileName varchar(255), CreatedOn DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP)";
sessionFactory.getCurrentSession().createSQLQuery(query2).executeUpdate();
String insert = "INSERT INTO "+tableName+"(Item, Asil, PartName, Template, ContentType, FileName) VALUES (:value1, :value2, :value3, :value4, :value5, :value6)";
Query query1 = sessionFactory.getCurrentSession().createSQLQuery(insert);
query1.setParameter("value1", template.getItem());
query1.setParameter("value2", template.getAsil());
query1.setParameter("value3", template.getPartName());
query1.setParameter("value4", template.getContent());
query1.setParameter("value5", template.getContentType());
query1.setParameter("value6", template.getFileName());
query1.executeUpdate();
}
借助上述代码,我可以上传.xls文档。 我从这两个方法上传了相同的.xls文档。我打开了MySql工作台,当我右键单击两个表中的数据库blob字段(在文本编辑器选项中选择打开值)并比较二进制选项卡时:内容不同,数据长度也以字节为单位不同。我不知道为什么,我想知道原因。
此外,当我尝试从方案1下载文档时,我能够成功下载。但是当我在场景2中使用相同的下载代码时,我无法下载。请帮帮我..
//从控制器下载方法
@RequestMapping("/downloadDocument/{documentId}")
public String download(@PathVariable("documentId") Integer documentId, HttpServletResponse response) {
BaseTemplateEntity doc = baseTemplateManager.getById(documentId);
try {
response.setHeader("Content-Disposition", "inline;filename=\"" +doc.getFileName()+ "\"");
OutputStream out = response.getOutputStream();
response.setContentType(doc.getContentType());
IOUtils.copy(doc.getContent().getBinaryStream(), out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}