【问题标题】:Save Image to MySql from Image URL (Spring JPA Hibernate)从图像 URL 将图像保存到 MySql (Spring JPA Hibernate)
【发布时间】:2019-04-05 10:12:54
【问题描述】:

我正在处理 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);
    }

【问题讨论】:

  • 使用 HTTP 客户端下载图片然后保存到数据库
  • System.setProperty("java.net.useSystemProxies", "true"); byte[] imageBytes = IOUtils.toByteArray(new URL("example.com/order/images/image001.jpg" ).openStream());

标签: java mysql spring hibernate jpa


【解决方案1】:

你可以在Rest Service中将图片url转换成data byte[]图片再保存。

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

【讨论】:

    【解决方案2】:

    好的问题解决了。将 Image Url 转换为字节数组的代码如下。有关此问题的更多答案,请参考here

    public static byte[] convertImageByte(URL url) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        InputStream is = null;
        try {
            is = new BufferedInputStream(url.openStream());
            byte[] byteChunk = new byte[4096];
            int n;
            while ( (n = is.read(byteChunk)) > 0 ) {
                baos.write(byteChunk, 0, n);
            }   
            return baos.toByteArray();
        }
        catch (IOException e) {e.printStackTrace ();}
        finally {
            if (is != null) { is.close(); }
        }
        return null;
    }
    

    将 Dto 保存到数据库时

    if(dto.getImageUrl() != null) {             
        try {
        URL imageUrl = new URL(dto.getImageUrl());
        itemDO.setImage(convertImageByte(imageUrl));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        entity = orderItemRepository.save(itemDO);
    

    从数据库中获取图像

    public byte[] getImageForOrderItem(long itemId) {
        Optional<OrderItemDO> option = orderItemRepository.findById(itemId);
        if(option.isPresent()) {
            OrderItemDO itemDO = option.get();
            if(itemDO.getImage() != null) {
                byte[] image = itemDO.getImage();
                return image;
            }
        }
        return null;
    }
    

    通过 Rest API 调用图像响应

    @GetMapping(path="/orderItem/image/{itemId}")
    @ResponseStatus(HttpStatus.OK)
    public void getImageForOrderItem(@PathVariable("itemId") long itemId, HttpServletResponse response) { 
        byte[] buffer = orderServiceImpl.getImageForOrderItem(itemId);
        if (buffer != null) {
            response.setContentType("image/jpeg");
            try {
                response.getOutputStream().write(buffer);
                response.getOutputStream().flush();
                response.getOutputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2011-11-04
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多