首页 > 解决方案 > 从图像 URL 将图像保存到 MySql (Spring JPA Hibernate)

问题描述

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

OrderDO.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<>();
}

OrderItemDO.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;
}

OrderRepository.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);
    }

标签: javamysqlspringhibernatejpa

解决方案


您可以在保存之前将图像 url 转换为 Rest Service 中的数据字节 [] 图像。

public static byte[] convertImageByte(URL url) throws IOException {

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        InputStream is = null;
        try {
            is = url.openStream ();
            byte[] byteChunk = new byte[4096]; // Or whatever size you want to read in at a time.
            int n;

            while ( (n = is.read(byteChunk)) > 0 ) {
                baos.write(byteChunk, 0, n);
            }
            return byteChunk;
        }
        catch (IOException e) {
            System.err.printf ("Failed while reading bytes from %s: %s", url.toExternalForm(), e.getMessage());
            e.printStackTrace ();
            // Perform any other exception handling that's appropriate.
        }
        finally {
            if (is != null) { is.close(); }
        }
        return null;
    }

推荐阅读