Java 将图像从图像URL保存到MySql(Spring JPA Hibernate)
我正在从事Spring JPA Hibernate项目,希望将图像从图像Url保存到Mysql数据库。我正在使用从Rest服务获取的图像URL将订单数据传递给数据。如何将图像URL作为图像保存到数据库。我想我们必须先从Url获取图像。请解决这个问题 OrderDO.javaJava 将图像从图像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
@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();
}
}
}