2012-05-09 3 views
8

У меня есть фасоль формы с атрибутами id, desc и imageByteArray. Действие Struts выполняется и перенаправляется в JSP, где я хочу получить доступ к этим атрибутам bean, таким как id, desc и преобразовать imageByteArray и отобразить его как изображение. Я пробовал это post, но это не работает для меня.Преобразование base64 байтового массива в изображение

кодировать ByteArray, используя Base64 - где this.bean.imageByteArray относится к форме фасоли

this.bean.setImageByteArray(new org.apache.commons.codec.binary.Base64().encode(imageInByteArr)); 

Я попытался это, но не работает

<img src="data:image/jpg;base64,<c:out value='${bean.imageByteArray}'/>" /> 

массив байтов (байт [] imageByteArray) ссылается на изображение в формате JPG с кодировкой base64, и я получаю следующий вывод img как вывод, и, очевидно, ничего не отображается,

<img src="data:image/jpg;base64,[[email protected]"> 

Любая идея, как преобразовать массив байтов base64 и отобразить как изображение в JSP?

+0

Пожалуйста, используйте то, что означает «но не работает». Как выглядел выход? Каков тип 'imageByteArray'? Думаю, вам нужно вызвать 'encodeString' ... – home

+0

@home Пожалуйста, см. Мой комментарий – SyAu

+0

Для тех, кому нужно отобразить реальный (не base64-кодированный) массив байтов в качестве изображения, перейдите к a.o. http://stackoverflow.com/q/2340406 – BalusC

ответ

11

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

Вы должны создать метод в фасоли


public String getByteArrayString() 
{ 
    return new String(this.imageByteArray); 
} 

и ссылки это в вашем JSP.

Хотя технически вы должны определить, какую кодировку использовать для массива base64 байтов, это необязательно, поскольку все символы находятся в стандартном 7-битном диапазоне ASCII.

+0

Отлично. Оно работает. Я проверил много сообщений SO, связанных с этим типом вопроса, но я не мог найти правильного ответа. Вы спасли мое время. Благодарю. – SyAu

+0

helpful..thanks :) –

+0

Я только что видел этот ответ, но это почти наверняка * не * правильная вещь, чтобы сделать здесь. Это в основном делает две плохие идеи друг на друга. OP уже выполняет кодировку base64 - поэтому следует сохранять это как * строку * внутри своего объекта, а не как массив байтов. В качестве альтернативы, они не должны base64-кодировать данные, пока они не выведут их. В основном правильное преобразование - 'byte []' в base64-закодированное строковое, а не '' byte [] для байта base64-encoded-then-ASCII-encoded [], а затем byte [] в строку ". –

3

Ответ DoubleMalt (принятый на момент написания статьи) является неудачным, потому что он использует два нарушения, чтобы сделать право. Это не помогает тому, что Apache Commons Codec делает так легко сделать неправильную вещь :(

Base64 в основном является кодировкой из двоичных данных в текст - как таковой, он должен почти всегда использоваться для преобразования byte[] в . String Ваш вопрос в том, что вы преобразования byte[] в другую byte[]. - но позже вы хотите использовать эти данные в виде строки было бы лучше, чтобы преобразовать раз, в правильном направлении

Теперь вы можете. выберите именно тогда, когда вы конвертируете в base64 (и строку). Вы можете сделать это раньше, в своем Java-коде, и в этом случае я бы использовал:

// Obviously you'd need to introduce a new method for this, replacing 
// setImageByteArray 
this.bean.setImageBase64(new Base64().encodeToString(imageInByteArr)); 
<img src="data:image/jpg;base64,<c:out value='${bean.imageBase64}'/>" /> 

В качестве альтернативы, вы можете сохранить только двоичные данные в вашем компоненте, и выполнять кодирование в JSP. Прошло много времени с тех пор, как я написал JSP, поэтому я не собираюсь писать код для этого здесь.

Но в основном вам необходимо решить, должен ли ваш компонент сохранять исходные двоичные данные как byte[], или данные с базовым кодом в виде String. Все остальное вводит в заблуждение, ИМО.

Смежные вопросы