0

I am working Spring JPA Hibernate project and want to save images to Mysql database from Image Url. I am passing Orders DTO data with Image URL taken from Rest Service. How to save Image urls as Images to Database. I think we have to get the image from Url first. Please solve this problem.

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);
    }
2
  • Use a HTTP client to download the images then save them to database Commented Nov 1, 2018 at 7:53
  • System.setProperty("java.net.useSystemProxies", "true"); byte[] imageBytes = IOUtils.toByteArray(new URL("example.com/order/images/image001.jpg" ).openStream()); Commented Nov 1, 2018 at 8:30

2 Answers 2

1

You can convert image url into data byte[] image in Rest Service before save it.

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;
    }
Sign up to request clarification or add additional context in comments.

Comments

0

Ok Problem solved. The code to convert Image Url to Byte Array is below. Please refer here for more answers in this problem

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

When Saving Dto to Database

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

Get Image From Database

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

Calling Image Response through 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();
        }
    } 
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.