Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: zomgcoptersОтветов: 1

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

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

ejbrichfacesajax4jsf

Ответы

Ответ 1 · zomgcopters

Его не удалось передать из-за того, что 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;
        }
    }

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы