Получение bytearray из базы данных в сервлете и в JSP - PullRequest
0 голосов
/ 04 февраля 2012

Я действительно не понимаю байтовые массивы ... может быть потому, что я работаю над изображениями в первый раз, поэтому мне нужна ваша помощь

У меня есть строка base64 R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHLWWWWWWWWWMVMVMRMVMR4MR4MR4MR4MR1R1RMR1RMR1RMR1RMR1RMR1RMR1R1RMR1R1R1MR5MR5MR4MH09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw ==

, который я декодирую и сохраняю в базе данных MySql, тогда я использую следующий код на моей стороне сервлета

if ( request.getParameter("imgID") != null )
    {

      iNumPhoto = Integer.parseInt(request.getParameter("imgID")) ;   


      try
      {  
                Class.forName("com.mysql.jdbc.Driver").newInstance();
               conn=DriverManager.getConnection("jdbc:mysql://localhost:9191/mbcss","root","admin");
               stmt= conn.createStatement();

         //conn.setAutoCommit (false);  

         // get the image from the database
         byte[] imgData = GetPhoto.getPhoto( conn, iNumPhoto );   
         System.out.println("imgData="+imgData);
         // display the image
         response.setContentType("image/gif");
         OutputStream o = response.getOutputStream();
         o.write(imgData);

         o.flush(); 
         o.close();
      }
      catch (Exception e)
      {
        e.printStackTrace();

      }
    }
         }

здесь - вот как получить*

таблица посещений содержит только 1 запись, но всякий раз, когда я выполняю свой jsp-файл, который вызывает класс сервлета imgData , который я напечатал на своей консоли, при каждом обновлении печатается различное значение, и изображение также не отображается в JSP

  1. Каждый раз при отображении различного значения возникает ошибка кодирования или характеристики байтового массива.
  2. Почему изображение не отображается, помогите мне

Ответы [ 3 ]

0 голосов
/ 04 февраля 2012

вы увидите последний файл изображения из вашей записи из базы данных BLOB-объектов, потому что массив байтов очищает его от каждой новой записи и заменяет новый файл изображения в месте исправления на странице JSP, вам нужно записать файл в локальный каталог и необходимость указать путь к этому месту

0 голосов
/ 05 февраля 2012

Необходимо убедиться, что вы правильно декодируете кодированное изображение Base64, а также что нет проблем с кодом, который добавляет изображение в базу данных.

Выполните обратный процесс:
(1) Извлечь представление изображения массива байтов из базы данных
(2) Сделать кодировку Base64 для массива байтов
(3) Создать строку из массива байтов в кодировке Base64.

1008 * Строка вы получаете, делая это должно иметь такое же значение, как и исходный R0lGODlhDwAPAKECAAAAzMzM ///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw == 1010 * Если это так, то вызнать, что вы делаете декодирование и хранение базы данных правильно;в противном случае, если значения отличаются, вам нужно исправить либо декодирование, либо код хранения базы данных.
0 голосов
/ 04 февраля 2012

Вам необходимо проверить следующее:

  1. В вашем запросе «Выбрать изображение из посещения» я не вижу предложения WHERE для ограничения результата, поэтому если у вас много строк, это может быть причиной для получения другого результата при каждом обновлении страницы .

  2. Изображение поля имеет тип BLOB в базе данных?

EDIT:

Проверяя документацию по MySQL, вы должны соблюдать некоторые правила. Сначала метод должен быть getBytes, а не getBlob. Другие правила:

Начиная с версии Connector / J 3.1.0, вы можете эмулировать BLOB с локаторы, добавив свойство emulateLocators = true в ваш URL JDBC. Используя этот метод, драйвер задержит загрузку актуальных BLOB-данных пока вы не получите другие данные, а затем использовать методы поиска (getInputStream (), getBytes () и т. д.) в потоке данных BLOB-объектов.

Вы должны использовать псевдоним столбца со значением столбца к фактическому имя BLOB, например:

SELECT id, 'data' как blob_data из blobtable. Вы также должны следовать эти правила:

SELECT должен ссылаться только на одну таблицу. Стол должен иметь первичный ключ.

SELECT должен иметь псевдоним исходного имени столбца большого двоичного объекта, указанного как строка с альтернативным именем.

SELECT должен охватывать все столбцы, составляющие первичный ключ.

Реализация BLOB не позволяет модифицировать на месте (они копии, как сообщается DatabaseMetaData.locatorsUpdateCopies () метод). Из-за этого используйте соответствующие PreparedStatement.setBlob () или ResultSet.updateBlob () (в случае обновляемые наборы результатов) методы для сохранения изменений обратно в базу данных.

Вы можете проверить больше на: http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-implementation-notes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...