使用 Rest 服务、Java 和 Angular JS 将存储在 Mysql 数据库中的图像显示为 Blob
Displaying images stored in Mysql database as Blob using Rest Services, Java and Angular JS
我正在构建一个使用 AngularJS 作为前端的 Web 应用程序。我正在使用 Rest 服务调用后端并在 Jboss Wildfly 中部署应用程序。该应用程序连接到一个 Mysql 数据库,我在其中有一个 Table 产品。
一个产品包含一个 ID 和一个存储为 BLOB 的图像。
Productjava实体如下,即:
@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "IMAGE", nullable = false, insertable = true, updatable = true)
private Blob image;
@Column(name="PRICE",nullable=false, insertable=true,updatable=true)
private Long price;
GETTERS AND SETTERS......
}
然后是休息服务的代码:
@Path("/products")
public class ProductsService extends CommonService{
private static final Logger log = Logger.getLogger(ProductsService.class);
@EJB
private ProductsServiceHandler handler;
@GET
public Response getAllProducts(@Context Request request, @Context HttpHeaders httpHeaders)
{
try
{
List<Product> products=handler.findAllProducts();
return Response.ok(products).header(ALLOW_ORIGIN_HEADER, "*").build();
}
catch(Exception e){return Response.status(Status.INTERNAL_SERVER_ERROR).build();}
}
从数据库中正确检索了产品,图像存储为 Blob,但是当我尝试发送响应时出现以下错误:
原因:com.fasterxml.jackson.databind.JsonMappingException:未找到 class java 的序列化程序。 io.ByteArrayInputStream 并且没有发现创建 BeanSerializer 的属性(为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链:java.util.ArrayList[0]->com.fgonzalez.domainmodel.Product["image"]->$Proxy70["binaryStream"])
我猜这是因为它不知道如何序列化 Blob。我注意到,如果我只将图像作为 InputStream 发送,它不会抱怨(但现在我必须弄清楚如何在 Html 中显示它)。知道如何实现我的需求吗?
非常感谢您!!
您遇到的问题是 Blob 本质上是一个 InputStream,而不是图像的字节 - 您必须读取 InputStream 才能获取图像字节。
如果你解决了这个问题,你 可以 通过 base-64 编码或其他方式传输二进制图像数据,但是你将在客户端尝试时遇到问题弄清楚如何显示它。
相反,如果可以的话,我会改变两件事:
只在数据库中存储图像名称,在磁盘上存储实际图像。
在JSon响应中,只发送图片名称——然后在客户端使用正常的HTML构造来显示图片——让浏览器单独请求来自服务器的图像。
我正在构建一个使用 AngularJS 作为前端的 Web 应用程序。我正在使用 Rest 服务调用后端并在 Jboss Wildfly 中部署应用程序。该应用程序连接到一个 Mysql 数据库,我在其中有一个 Table 产品。 一个产品包含一个 ID 和一个存储为 BLOB 的图像。 Productjava实体如下,即:
@Entity
@Table(name = "PRODUCTS")
public class Product implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;
@Column(name = "IMAGE", nullable = false, insertable = true, updatable = true)
private Blob image;
@Column(name="PRICE",nullable=false, insertable=true,updatable=true)
private Long price;
GETTERS AND SETTERS......
}
然后是休息服务的代码:
@Path("/products")
public class ProductsService extends CommonService{
private static final Logger log = Logger.getLogger(ProductsService.class);
@EJB
private ProductsServiceHandler handler;
@GET
public Response getAllProducts(@Context Request request, @Context HttpHeaders httpHeaders)
{
try
{
List<Product> products=handler.findAllProducts();
return Response.ok(products).header(ALLOW_ORIGIN_HEADER, "*").build();
}
catch(Exception e){return Response.status(Status.INTERNAL_SERVER_ERROR).build();}
}
从数据库中正确检索了产品,图像存储为 Blob,但是当我尝试发送响应时出现以下错误:
原因:com.fasterxml.jackson.databind.JsonMappingException:未找到 class java 的序列化程序。 io.ByteArrayInputStream 并且没有发现创建 BeanSerializer 的属性(为避免异常,禁用 SerializationFeature.FAIL_ON_EMPTY_BEANS))(通过引用链:java.util.ArrayList[0]->com.fgonzalez.domainmodel.Product["image"]->$Proxy70["binaryStream"])
我猜这是因为它不知道如何序列化 Blob。我注意到,如果我只将图像作为 InputStream 发送,它不会抱怨(但现在我必须弄清楚如何在 Html 中显示它)。知道如何实现我的需求吗?
非常感谢您!!
您遇到的问题是 Blob 本质上是一个 InputStream,而不是图像的字节 - 您必须读取 InputStream 才能获取图像字节。
如果你解决了这个问题,你 可以 通过 base-64 编码或其他方式传输二进制图像数据,但是你将在客户端尝试时遇到问题弄清楚如何显示它。
相反,如果可以的话,我会改变两件事:
只在数据库中存储图像名称,在磁盘上存储实际图像。
在JSon响应中,只发送图片名称——然后在客户端使用正常的HTML构造来显示图片——让浏览器单独请求来自服务器的图像。