Загрузка изображений пользователем с помощью Servlet и Hibernate - PullRequest
0 голосов
/ 23 сентября 2018

При вставке нового продукта через форму с изображением, изображение сначала принимается как 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;

1 Ответ

0 голосов
/ 23 сентября 2018

Преобразование 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, а затем копирует его в байтовый массив.

...