为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

30秒到达战场 2021-12-22 18:49:32
我正在工作 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@Repositorypublic interface OrderRepository extends CrudRepository<OrderDO, Long>{    public Page<OrderDO> findAll(Pageable pageable);    }OrderServiceImpl.javapublic 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);    }
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在保存之前,您可以在 Rest Service 中将图像 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;

    }


查看完整回答
反对 回复 2021-12-22
?
波斯汪

TA贡献1811条经验 获得超4个赞

好的问题解决了。将图像 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;

}

通过 Rest API 调用 Image Response


@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();

        }

    } 

}


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信