用户使用Servlet和Hibernate上传图像

问题描述 投票:1回答:1

当通过带有图像的表单插入新产品时,图像首先被接收为PART,然后转换为INPUT STREAM,最后转换为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;
java hibernate servlets backend
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.