primeFaces: fileUpload to byte [] - PullRequest
       12

primeFaces: fileUpload to byte []

4 голосов
/ 16 декабря 2011

Я пытаюсь получить загруженное изображение <p:fileUpload> как byte[] и сохранить его в БД с помощью JPA.Но я столкнулся с проблемой, и я даже не уверен, правильно ли я ее кодирую.

Это сущность:

@Entity
class Object { 
  @Lob
  @Column(name = "image")
  private byte[] image;
  //... 
}

Управляемый компонент:

@ManagedBean
class MyBean {

   private Object ob = new Object();

   @EJB 
   private ObjectFacadeLocal of;

   public void handleFileUpload(FileUploadEvent event) {
      byte[] content = event.getFile().getContents();
      ob.setImage(content);
   }

   public String submit() {
      //...
      of.create(ob);
      return "anotherpage"
   }

ObjectFacade сохраняется Object в базе данных.

Это страница JSF с именем form.xhtml:

<h:form id = "upi" enctype = "multipart/form-data"> 
    <p:fileUpload fileUploadListener="#{MyBean.handleFileUpload}"   
          allowTypes="*.jpg;*.png;*.gif;" description="Images"/>  
    <h:commandButton value = "Submit" action = "#{MyBean.create()}">
    </h:commandButton>
</h:form>

Прежде всего, я получаюв form.xhtml предупреждение о том, что он не может найти метод handleFileUpload, но я все еще могу его запустить.Когда я нажимаю кнопку отправки, то ничего не происходит, страница просто обновляется.Если я удаляю атрибут enctype, то объект сохраняется, но не с изображением.

Есть идеи?


Обновление :

Это мой web.xml файл:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee /web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/blog.xhtml</welcome-file>
    </welcome-file-list>
    <filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
</web-app>

1 Ответ

4 голосов
/ 16 декабря 2011

Вы забыли прочитать Руководство пользователя PrimeFaces .Вот выдержка из главы <p:fileUpload>:

Начало работы с FileUpload

Первое, что нужно сделать, - это настроить фильтр загрузки файлов, который анализирует составной запрос.Фильтр FileUpload должен сопоставляться с сервлетом Faces.

<filter>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PrimeFaces FileUpload Filter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

Без этого фильтра ни один метод действия внутри <h:form enctype="multipart/form-data"> не может быть вызван, а отправленные данные не будут проанализированы должным образом.* Что касается предупреждения о том, что метод не может быть найден, это относится к используемой вами среде IDE, которая притворяется умнее, чем есть.Отключите проверку EL в этой IDE, чтобы избежать этих вводящих в заблуждение предупреждений, и посмотрите, не можете ли вы обновить IDE.

...