Подтвердить что ты не робот

Преобразовать байт [] в строку Base64 для URI данных

Я знаю, что это, вероятно, было задано 10000 раз, однако я не могу найти прямой ответ на вопрос.

У меня есть LOB, хранящийся в моем db, который представляет изображение; Я получаю это изображение из БД, и я хотел бы показать его на веб-странице с помощью тега HTML IMG. Это не мое предпочтительное решение, но это реализация зазоров, пока я не смогу найти лучшее решение.

Я пытаюсь преобразовать байт [] в Base64 с помощью кодека Apache Commons следующим образом:

String base64String = Base64.encodeBase64String({my byte[]});

Затем я пытаюсь показать свое изображение на моей странице следующим образом:

<img src="data:image/jpg;base64,{base64String from above}"/>

Он отображает браузер по умолчанию "Я не могу найти это изображение", изображение.

Есть ли у кого-нибудь идеи?

Спасибо.

4b9b3361

Ответ 1

Я использовал это, и он работал нормально (вопреки принятому ответу, который использует формат, не рекомендованный для этого сценария):

StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(StringUtils.newStringUtf8(Base64.encodeBase64(imageByteArray, false)));
contourChart = sb.toString();

Ответ 4

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

Здесь приведен пример потоковой передачи изображения, содержащегося в файле, в браузер через сервлет, который может быть легко принят для потоковой передачи содержимого вашего BLOB, а не файла:

  public void doGet(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
  {
    ServletOutputStream sos = resp.getOutputStream();
    try {
      final String someImageName = req.getParameter(someKey);

      // encode the image path and write the resulting path to the response
      File imgFile = new File(someImageName);

      writeResponse(resp, sos, imgFile);
    }
    catch (URISyntaxException e) {
      throw new ServletException(e);
    }
    finally {
      sos.close();
    }
  }

  private void writeResponse(HttpServletResponse resp, OutputStream out, File file)
    throws URISyntaxException, FileNotFoundException, IOException
  {
    // Get the MIME type of the file
    String mimeType = getServletContext().getMimeType(file.getAbsolutePath());
    if (mimeType == null) {
      log.warn("Could not get MIME type of file: " + file.getAbsolutePath());
      resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
      return;
    }

    resp.setContentType(mimeType);
    resp.setContentLength((int)file.length());

    writeToFile(out, file);
  }

  private void writeToFile(OutputStream out, File file)
    throws FileNotFoundException, IOException
  {
    final int BUF_SIZE = 8192;

    // write the contents of the file to the output stream
    FileInputStream in = new FileInputStream(file);
    try {
      byte[] buf = new byte[BUF_SIZE];
      for (int count = 0; (count = in.read(buf)) >= 0;) {
        out.write(buf, 0, count);
      }
    }
    finally {
      in.close();
    }
  }

Ответ 5

Если вы не хотите передавать потоки с сервлета, сохраните файл в каталоге в webroot и затем создайте src, указывающий на это место. Таким образом, веб-сервер выполняет работу по обслуживанию файла. Если вы чувствуете себя особенно умно, вы можете проверить существующий файл по timestamp/inode/crc32 и только записать его, если он изменился в БД, что может дать вам повышение производительности. Этот файловый метод также автоматически поддерживает ETag и if-modified-since с заголовками, чтобы браузер мог кэшировать файл должным образом.