面临从blob字段检索内容的问题

时间:2015-12-18 12:42:32

标签: mysql spring hibernate

我正在开发一个基于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;
    }

0 个答案:

没有答案