用户使用 Servlet 和 Hibernate 上传的图像



当通过带有图像的表单插入新产品时,图像首先作为PART接收,然后转换为输入流,最后转换为BYTE[],然后将其插入数据库,但数据库中的文件仅显示文件大小几个字节。图像未插入到数据库中。正在插入一些数据,但没有图像。我是这一切的新手,请帮忙。用户应该能够从任何地方插入任何图像。

Myservlet 页面

try (PrintWriter out = response.getWriter()) {
Produkt produkt = new Produkt();
ProduktDAO produkt_dao = new ProduktDAO();
if (request.getParameter("submit") != null) {
SessionFactory session_factory = DatabaseConnection.getSession_factory();
Session session = session_factory.openSession();
session.beginTransaction();
String produkt_kategorie = request.getParameter("produkt_kategorie");
String produkt_preis = request.getParameter("produkt_preis");
String produkt_code = request.getParameter("produkt_code");
String produkt_name = request.getParameter("produkt_name");
String produkt_einzelheiten = request.getParameter("produkt_einzelheiten");

Part produkt_bild = request.getPart("produkt_bild");
InputStream eingang_storm =  produkt_bild.getInputStream();
byte[] bild_daten = new byte[(int) eingang_storm.read()];
produkt.setProdukt_kategorie(produkt_kategorie);
produkt.setProdukt_preis(produkt_preis);
produkt.setProdukt_code(produkt_code);
produkt.setProdukt_name(produkt_name);
produkt.setProdukt_einzelheiten(produkt_einzelheiten);
produkt.setBild_daten(bild_daten);
produkt_dao.einfugenProdukt(produkt);
request.getRequestDispatcher("add_new_product.jsp").forward(request, response);

实体页

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int product_id;
@Column(name = "produkt_kategorie", nullable = false, length = 500)
private String produkt_kategorie;
@Column(name = "produkt_preis", nullable = false, length = 500)
private String produkt_preis;
@Column(name = "produkt_code", nullable = false, length = 500)
private String produkt_code;
@Column(name = "produkt_name", nullable = false, length = 500)
private String produkt_name;
@Column(name = "produkt_einzelheiten", nullable = false, length = 1500)
private String produkt_einzelheiten;
@Lob
@Column(name = "produkt_bild", nullable = false,columnDefinition = "longblob")
private byte[]  bild_daten;

byte[]转换是错误的。你得到InputStream的第一个字节与read,并使用它来创建一个空byte[],其第一个字节的长度转换为int。这是没有道理的。

试试这个:

ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[1024];
while ((nRead = eingang_storm.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
byte[] bild_daten = buffer.toByteArray();

这会将您的InputStream1K 块转换为ByteArrayOutputStream,然后将其复制到字节数组。

最新更新