Преобразовать байт [] в строку 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}"/>
Он отображает браузер по умолчанию "Я не могу найти это изображение", изображение.
Есть ли у кого-нибудь идеи?
Спасибо.
Ответы
Ответ 1
Я использовал это, и он работал нормально (вопреки принятому ответу, который использует формат, не рекомендованный для этого сценария):
StringBuilder sb = new StringBuilder();
sb.append("data:image/png;base64,");
sb.append(StringUtils.newStringUtf8(Base64.encodeBase64(imageByteArray, false)));
contourChart = sb.toString();
Ответ 2
Согласно официальной документации Base64.encodeBase64URLSafeString(byte[] binaryData)
должно быть то, что вы ищете.
Также тип mime для JPG равен image/jpeg
.
Ответ 3
Это правильный синтаксис. Возможно, ваш веб-браузер не поддерживает схему URI данных. См. Какие браузеры поддерживают URI данных и с какой версии?
Кроме того, тип MIME JPEG image/jpeg
.
Ответ 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 с заголовками, чтобы браузер мог кэшировать файл должным образом.