Показать изображение, загруженное с помощью bean-компонента с областью запроса

Я пытаюсь загрузить файл изображения в базу данных. Прежде чем изображение будет сохранено, я хотел бы отобразить его пользователю.

У меня есть bean-компонент с областью запроса, UserInfoBean (который я не могу изменить из-за области запроса), который я пытаюсь использовать для сохранения данных, однако preview byte[] имеет значение null при вызове краски. Есть ли способ сохранить preview или image, доступ к UploadItem при вызове paint()?

код info.xhtml:

<a4j:outputPanel id="preview" 
                    <a4j:mediaOutput id="imgPreview"
                                     element="img"
                                     mimeType="image/jpeg"
                                     createContent="#{userInfo.paint}"
                                     cacheable="false"
                                     style="width:150px; height:100px;" />
                    <br/>
 </a4j:outputPanel>

  <a4j:outputPanel id="signatureStampDisplay">
            <br/>                
            <rich:fileUpload fileUploadListener="#{userInfo.uploadImage}"
                             id="upload"
                             listHeight="40px"
                             acceptedTypes="#{userInfo.supportedTypes}"
                             ontyperejected="alert('Only JPG, GIF, PNG, BMP, and TIF files are accepted');"
                             maxFilesQuantity="1"
                             immediateUpload="true"
                             autoclear ="true"
                             disabled="#{userInfo.stampSet}">
                             <a4j:support event="onuploadcomplete"
                                          limitToList="true"
                                          reRender="preview"/>
            </rich:fileUpload>

        </a4j:outputPanel>     

Часть UserInfoBean с UploadItem изображением и byte[] предварительным просмотром:

public void uploadImage(UploadEvent evt) throws IOException{
        image = evt.getUploadItem();
        if(image != null){
             //preview is a byte[]
             preview = FileUtils.readFileToByteArray(image.getFile());
        }
    }

public void paint(OutputStream stream, Object object) throws IOException{
        if(preview != null){
             stream.write(preview);
        }
    }

person zomgcopters    schedule 12.06.2014    source источник
comment
Добавьте stream.close(); после stream.write(preview); + вам нужно правильно установить mimeType в a4j:mediaOutput.   -  person Vasil Lukach    schedule 12.06.2014
comment
@VasilLukach, к сожалению, paint видит preview как нуль. Тем не менее, я внес рекомендованные вами изменения, спасибо за это.   -  person zomgcopters    schedule 12.06.2014
comment
Ваша загрузка прошла успешно? Если да, сохраните предварительный просмотр в другом месте с большей областью действия или в БД и повторите попытку перерисовки. Возможно, ваши данные недоступны, потому что bean-компонент находится в области запроса.   -  person Vasil Lukach    schedule 12.06.2014
comment
Выгрузка была. Я думаю, что проблема заключалась в том, что он находится в области запроса, но из-за того, как другие вещи на странице взаимодействуют с большим сайтом, мне пришлось оставить его в области запроса, иначе я столкнулся бы с огромным переписыванием. Думаю, мне удалось успешно использовать HttpSession session.setAttribute(name, object) для передачи изображения, и сейчас я его тестирую.   -  person zomgcopters    schedule 12.06.2014
comment
@VasilLukach Я опубликовал то, что сработало для меня, если вам интересно. Спасибо за помощь, я заметил, что вы также помогли в вопросе, который у меня был вчера.   -  person zomgcopters    schedule 12.06.2014


Ответы (1)


Его не удалось передать из-за того, что bean-компонент находится в области запроса.

Использование объекта HttpSession javax.servlet.http.HttpSession;

Я смог сохранить byte[] preview, пока он был нужен, удалив его из сеанса после того, как он был отображен в paint

public void uploadImage(UploadEvent evt) throws IOException{
        image = evt.getUploadItem();
        if(image != null){
             preview = FileUtils.readFileToByteArray(signature.getFile());
             HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
             session.setAttribute("preview", preview);
        }
    }

public void paint(OutputStream stream, Object object) throws IOException{
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
        preview = (byte[]) session.getAttribute("preview");
        if(preview != null){
            stream.write(preview);
            stream.close();
            session.removeAttribute("preview");
            signaturePreview = null;
        }
    }
person zomgcopters    schedule 12.06.2014
comment
Чтобы добавить к этому, использование ‹a4j:keepAlive › в html также не будет работать. Он хранит загруженную информацию в области просмотра, к которой нельзя получить доступ с помощью атрибута createContent a4j: mediaOutput, что также требует этого обходного пути. - person zomgcopters; 13.06.2014