Изображение повреждается при сохранении и извлечении его из базы данных с использованием Spring MVC - PullRequest
0 голосов
/ 22 октября 2018

У меня проблема при сохранении и получении изображения из базы данных MySQL.Я могу сохранить изображение в базе данных MySQL следующим образом.

Страница JSP (Multipart Object) -> byte [] в классе обслуживания -> SerialBlob в классе DAO.

  • Со страницы JSP с использованием EL и SpEL я передал файл изображения в виде объекта Multipart, а затем в контроллер преобразовал multipart в байт [] и сохранил его внутри DTO, а затем передал этот байт []преобразовав его в SerialBLOB в классе Service и сохранив в базе данных, используя DAO.Он работает эффективно.

  • Чтобы извлечь изображение из базы данных, сначала я сохранил полученное изображение в виде объекта BLOB, а затем преобразовал его в байт [], но для просмотра изображенияв JSP мне пришлось конвертировать byte []] в формат String.Он работает, когда я создал два разных проекта для хранения и извлечения изображений.

  • Но проблема возникла, когда я попытался сохранить и извлечь изображение из базы данных, для этого у меня былоизменить тип возвращаемого свойства изображения моего DTO на String, потому что мне пришлось передать String на мою страницу JSP для просмотра изображения.Здесь, получение работало нормально, но когда я пытался сохранить файл изображения при преобразовании multipart в строку и строку в (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!";
}

Пожалуйста, помогите мне и дайте мне любое предложение, чтобы этого не произошло.Если у вас есть другие идеи для этой операции, пожалуйста, скажите мне.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...