使用Spring MVC存储图像并从数据库中检索图像时图像被损坏

时间:2018-10-22 17:33:24

标签: java spring-mvc

从MySQL数据库存储和检索图像时出现问题。我可以通过以下方式将图像保存在MySQL数据库中。

JSP页面(多部分对象)->服务类中的byte []-> DAO类中的SerialBlob。

  • 在EL和SpEL的JSP页面中,我以Multipart对象的形式传递了图像文件,然后在控制器中将 multipart转换为byte [] 并将其存储在DTO中,然后传递将该字节[]转换为Service类中的 SerialBLOB ,然后使用DAO将其存储到数据库中。 它正在有效地工作。

  • 要从数据库中检索图像,首先我以BLOB对象的形式存储了检索的图像,然后将其转换为byte [],但是要查看图像为JSP,我必须将byte []]转换为字符串格式。当我创建了两个不同的项目来存储和检索图像时,它就起作用了。

  • 但是,当我尝试同时从数据库存储和检索图像时,问题就来了,因为我必须将DTO的image属性返回类型更改为String,因为必须将String传递到JSP页面中才能查看图片。在这里,检索工作正常,但是当我尝试将多部分转换为字符串并将字符串转换为(string-> byte []-> SerialBLOB)SerialBLOB时,我尝试存储图像文件时,将其存储到数据库中,但是图像损坏了,它说是图片无效(打开时)。

控制器代码段:

    @RequestMapping(value = "/insert", method = RequestMethod.POST)
    public String productsPageInsert(Map<String, Object> map, @Valid 
    @ModelAttribute("productCmd") ProductsCommand productsCommand, 
    BindingResult errors) throws IOException {

      List<ProductLinksDTO> listLinksDTO = null;
      ProductLinksDTO linkDTO1 = null, linkDTO2 = null;
      ProductsDTO productsDTO = null;
      List<ProductsDTO> listDTO = null;
      String result = null;

      try {
        if (errors.hasErrors()) {
            return "adminProductsDef";
        }
        listLinksDTO = new ArrayList<>();
        listDTO = new ArrayList<>();
        linkDTO1 = new ProductLinksDTO();
        linkDTO2 = new ProductLinksDTO();
        productsDTO = new ProductsDTO();

        // Adding links to list
        linkDTO1.setLink(productsCommand.getLinkFirst());
        linkDTO2.setLink(productsCommand.getLinkSecond());
        listLinksDTO.add(linkDTO1);
        listLinksDTO.add(linkDTO2);

        // Adding data into dto
        productsDTO.setProductName(productsCommand.getProductName());
        productsDTO.setDescription(productsCommand.getDescription());
        productsDTO.setLinks(listLinksDTO);

        // adding image into products dto.
        productsDTO.setImage(new String(productsCommand.getImage().getBytes()));

        listDTO.add(productsDTO);

        result = productsService.addProduct(productsDTO);
        map.put("resultMsg", result);
        map.put("products", listDTO);

        return "redirect: /home_page/products_page.htm";
        } catch (DataAccessException dae) {
        map.put("errorMsg", dae.getMessage() + "\n" + dae.getStackTrace());
        return "failure";
        } catch (SerialException e) {
        map.put("errorMsg", e.getMessage() + "\n" + e.getStackTrace());
        return "failure";
        } catch (SQLException e) {
        map.put("errorMsg", e.getMessage() + "\n" + e.getStackTrace());
        return "failure";
        } catch (Exception e) {
        map.put("errorMsg", e.getMessage() + "\n" + e.getStackTrace());
        return "failure";
        }
   }
  • 当我将Multipart目标文件转换为String时,它一定会损坏。

服务类别摘要

@Override
@Transactional
public String addProduct(ProductsDTO productsDTO) throws SerialException, SQLException {
    int count = 0;
    ProductsHLO productsHLO = null;

    List<ProductLinksHLO> listLinkHLO = new ArrayList<>();
    productsHLO = new ProductsHLO();

    // copy dto data into hlo

        productsDTO.getLinks().forEach(linkDTO -> {
        ProductLinksHLO linkHLO = new ProductLinksHLO();
        BeanUtils.copyProperties(linkDTO, linkHLO);
        listLinkHLO.add(linkHLO);
    });

    productsHLO.setDescription(productsDTO.getDescription());

    // converting (image) String into SerialBlob  
    productsHLO.setImage(new SerialBlob(productsDTO.getImage().getBytes()));

    productsHLO.setProductName(productsDTO.getProductName());
    productsHLO.setLinks(listLinkHLO);

    // executing dao method
    count = productsDAO.insertProduct(productsHLO);
    if (count != 0)
        return "Product added successfully";
    else
        return "Product Not added!";
}

请帮助我,给我任何建议,这样就不会发生。如果您对此操作还有其他想法,请告诉我。

谢谢。

0 个答案:

没有答案