从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";
}
}
@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!";
}
请帮助我,给我任何建议,这样就不会发生。如果您对此操作还有其他想法,请告诉我。
谢谢。