Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将图像从图像URL保存到MySql(Spring JPA Hibernate)_Java_Mysql_Spring_Hibernate_Jpa - Fatal编程技术网

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

Java 将图像从图像URL保存到MySql(Spring JPA Hibernate),java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我正在从事Spring JPA Hibernate项目,希望将图像从图像Url保存到Mysql数据库。我正在使用从Rest服务获取的图像URL将订单数据传递给数据。如何将图像URL作为图像保存到数据库。我想我们必须先从Url获取图像。请解决这个问题 OrderDO.java @Table(name = "ORDER") public class OrderDO implements Serializable{ @Column(name = "ORDER_NUMBER", nullab

我正在从事Spring JPA Hibernate项目,希望将图像从图像Url保存到Mysql数据库。我正在使用从Rest服务获取的图像URL将订单数据传递给数据。如何将图像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<>();
}
OrderRepository.java

@Repository
public interface OrderRepository extends CrudRepository<OrderDO, Long>{

    public Page<OrderDO> findAll(Pageable pageable);    

}
@存储库
公共接口OrderRepository扩展了Crudepository{
公共页面findAll(可分页);
}
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);
    }
公共类OrderServiceImpl{ @自动连线 私有模型映射器模型映射器; @自动连线 专用医嘱存储库医嘱存储库; 专用OrderDO映射(订单dto){ OrderDO OrderDO=modelMapper.map(dto,OrderDO.class); Set itemsDO=new HashSet(); 对于(OrderItem项:dto.getItems()){ OrderItemDO itemDO=映射(项目); itemDO.setOrder(orderDO); 项目DO.add(项目DO); } orderDO.setItems(itemsDO); 退货订单; } 公共OrderItemDO映射(OrderItemDTO){ OrderItemDO itemDO=modelMapper.map(dto,OrderItemDO.class); 返回itemDO; } 公共秩序保存令(订单dto){ OrderDO entity=this.map(dto); 实体=orderRepository.save(实体); 返回此.map(实体); }
在保存图像之前,您可以在Rest服务中将图像url转换为数据字节[]图像

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

确定问题已解决。下面是将图像Url转换为字节数组的代码。请参阅此问题的更多答案

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

使用HTTP客户端下载图像,然后将其保存到databaseSystem.setProperty(“java.net.useSystemProxies”,“true”);byte[]imageBytes=IOUtils.toByteArray(新URL(“”.openStream());
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;
}
@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();
        }
    } 
}