将图像从图像 URL 保存到 MySql (Spring JPA Hibernate)

我正在工作 Spring JPA Hibernate 项目并希望将图像从 Image Url 保存到 Mysql 数据库。我正在使用从 Rest Service 获取的图像 URL 传递 Orders DTO 数据。如何将图像 url 作为图像保存到数据库。我认为我们必须首先从 Url 获取图像。请解决这个问题。


订单DO.java


@Table(name = "ORDER")

public class OrderDO  implements Serializable{


    @Column(name = "ORDER_NUMBER", nullable = false)

    private String orderNumber; 


    @OneToMany(cascade = CascadeType.ALL, mappedBy="order")

    private Set<OrderItemDO> items = new HashSet<>();

}

订单项DO.java


@Table(name = "ORDER_ITEM")

public class OrderItemDO implements Serializable{   


    @Column(name = "PRODUCT_NAME",nullable = false)

    private String name;


    @Lob

    @Column(name = "IMAGE")

    private byte[] image;


    @ManyToOne(cascade=CascadeType.ALL)

    @JoinColumn(name="ORDER_ID", referencedColumnName="ID")

    private OrderDO order;

}

订单仓库.java


@Repository

public interface OrderRepository extends CrudRepository<OrderDO, Long>{


    public Page<OrderDO> findAll(Pageable pageable);    


}

OrderServiceImpl.java


public class OrderServiceImpl {


    @Autowired

    private ModelMapper modelMapper;


    @Autowired

    private OrderRepository orderRepository;


    private OrderDO map(Order dto) {

        OrderDO orderDO =  modelMapper.map(dto, OrderDO.class);


        Set<OrderItemDO> itemsDO = new HashSet<>();

        for(OrderItem item : dto.getItems()) {

            OrderItemDO itemDO = map(item);

            itemDO.setOrder(orderDO);

            itemsDO.add(itemDO);

        }

        orderDO.setItems(itemsDO);      

        return orderDO; 

    }


    public OrderItemDO map(OrderItem dto) {

        OrderItemDO itemDO = modelMapper.map(dto, OrderItemDO.class);

        return itemDO;

    }


    public Order SaveOrder(Order dto) {

        OrderDO entity = this.map(dto);

        entity = orderRepository.save(entity);

        return this.map(entity);

    }


30秒到达战场
浏览 123回答 2
2回答

慕田峪7331174

在保存之前,您可以在 Rest Service 中将图像 url 转换为数据字节 [] 图像。public static byte[] convertImageByte(URL url) throws IOException {&nbsp; &nbsp; &nbsp; &nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream();&nbsp; &nbsp; &nbsp; &nbsp; InputStream is = null;&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; is = url.openStream ();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int n;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while ( (n = is.read(byteChunk)) > 0 ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baos.write(byteChunk, 0, n);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return byteChunk;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace ();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Perform any other exception handling that's appropriate.&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; finally {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (is != null) { is.close(); }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }

波斯汪

好的问题解决了。将图像 URL 转换为字节数组的代码如下。有关此问题的更多答案,请参阅此处public static byte[] convertImageByte(URL url) throws IOException {&nbsp; &nbsp; ByteArrayOutputStream baos = new ByteArrayOutputStream();&nbsp; &nbsp; InputStream is = null;&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; is = new BufferedInputStream(url.openStream());&nbsp; &nbsp; &nbsp; &nbsp; byte[] byteChunk = new byte[4096];&nbsp; &nbsp; &nbsp; &nbsp; int n;&nbsp; &nbsp; &nbsp; &nbsp; while ( (n = is.read(byteChunk)) > 0 ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; baos.write(byteChunk, 0, n);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return baos.toByteArray();&nbsp; &nbsp; }&nbsp; &nbsp; catch (IOException e) {e.printStackTrace ();}&nbsp; &nbsp; finally {&nbsp; &nbsp; &nbsp; &nbsp; if (is != null) { is.close(); }&nbsp; &nbsp; }&nbsp; &nbsp; return null;}将 Dto 保存到数据库时if(dto.getImageUrl() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; try {&nbsp; &nbsp; URL imageUrl = new URL(dto.getImageUrl());&nbsp; &nbsp; itemDO.setImage(convertImageByte(imageUrl));&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; entity = orderItemRepository.save(itemDO);从数据库中获取图像public byte[] getImageForOrderItem(long itemId) {&nbsp; &nbsp; Optional<OrderItemDO> option = orderItemRepository.findById(itemId);&nbsp; &nbsp; if(option.isPresent()) {&nbsp; &nbsp; &nbsp; &nbsp; OrderItemDO itemDO = option.get();&nbsp; &nbsp; &nbsp; &nbsp; if(itemDO.getImage() != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; byte[] image = itemDO.getImage();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return image;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return null;}通过 Rest API 调用 Image Response@GetMapping(path="/orderItem/image/{itemId}")@ResponseStatus(HttpStatus.OK)public void getImageForOrderItem(@PathVariable("itemId") long itemId, HttpServletResponse response) {&nbsp;&nbsp; &nbsp; byte[] buffer = orderServiceImpl.getImageForOrderItem(itemId);&nbsp; &nbsp; if (buffer != null) {&nbsp; &nbsp; &nbsp; &nbsp; response.setContentType("image/jpeg");&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.getOutputStream().write(buffer);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.getOutputStream().flush();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; response.getOutputStream().close();&nbsp; &nbsp; &nbsp; &nbsp; } catch (IOException e) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.printStackTrace();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java