Как загрузить файл, используя JSF / Primefaces? - PullRequest
3 голосов
/ 01 марта 2012

Я хочу загрузить файл, используя JSF2.0 / Primefaces, используя <p:fileUpload>. Я не нашел никакой документации, которая могла бы мне помочь.

У меня есть две таблицы: Person(name,lastnam....) и file(id,path,name,size) Сценарий, которого я хочу достичь:

  • Пользователь подписывается на мой сайт, я сохраняю его информацию, включая загруженные файлы
  • Когда файл загружен, я хочу сохранить его на своем диске и сохранить путь в мою базу данных
    (чтобы сохранить связь между пользователем и его файлами)

Поэтому, когда пользователь нажимает кнопку Сохранить , я сохраняю всю эту информацию.

Вот мой index.xhtml

<h:form >
     <p:panel header="Add User"    style="width: 500px; font-size: 14px">
        <h:panelGrid width="width: 300px;"    columns="2">


         <h:outputLabel style="font-size: 13px" value="Name" /> <h:inputText value="#{AddPerson.lastname}" />
         <h:outputLabel value="LastName"/> <h:inputText value="#{AddPerson.name}" />

          <h:outputLabel value="Marital Status"/>
          <h:selectOneMenu id="status" value="#{AddPerson.status}">
             <f:selectItem itemValue="Single" itemLabel="Single"/>
             <f:selectItem itemValue="Married" itemLabel="Married"/>
          </h:selectOneMenu>

          <h:outputLabel value="Bith date "/> <p:calendar value="#{AddPerson.birthdate}" id="popupButtonCal" showOn="button" />
          <h:outputLabel value="email"/><h:inputText value="#{AddPerson.email}" />
           <h:outputLabel value="mobile"/><h:inputText value="#{AddPerson.mobile}" />
           <h:outputLabel value="fax"/><h:inputText value="#{AddPerson.fax}" />
           <h:outputLabel value="Job"/><h:inputText value="#{AddPerson.Job}" />
           <h:outputLabel value="addresse"/><h:inputText value="#{AddPerson.addresse}" />
           <h:outputLabel value="code"/><h:inputText value="#{AddPerson.code}" />
           <h:outputLabel value="Country"/><h:inputText value="#{AddPerson.country}" />
           <h:outputLabel value="login"/><h:inputText value="#{AddPerson.login}" />
           <h:outputLabel value="password"/><h:inputText value="#{AddPerson.password}" />

           <h:outputLabel value="CV"/>  <input type="file" name="uploaded_file"/>
           <p:fileUpload fileUploadListener="#{AddPerson...."   update="messages"   sizeLimit="500000"    allowTypes="/(\.|\/)(gif|jpe?g|png)$/"/>  
            <p:growl id="messages" showDetail="true"/>     // **example :taken from primefaces showcases**

            <h:commandButton action="#{AddPerson.addUserDB}"  value="Add User" />

       </h:panelGrid>
       </p:panel>
</h:form>

а вот My bean

public void addUserDB() {
    try {

        EntityTransaction entr = em.getTransaction();
        entr.begin();

        Person user = new Person();

        user.setNom(lastname);
        user.setPrenom(name);
        user.setCodepostal(code);
        user.setEmail(email);
        user.setEtatCivil(status);
        user.setFax(fax);
        user.setDateNaissance(birthdate);
        user.setMobile(mobile);
        user.setAdresse(addresse);
        user.setPays(country);
        user.setLogin(login);
        user.setPassword(password);

        //**I should also add here the path of the file to the table and save the file on the disc  !!!!**         

        em.persist(user);

        entr.commit();
    } catch (Exception e) {
        System.out.println(e.getMessage());
        System.out.println("Failed");
    } finally {
        em.close();
    }

}

Ответы [ 2 ]

10 голосов
/ 01 марта 2012

где реализация fileUploadListener? Я обычно просто делаю это:

<p:fileUpload cancelLabel="#{msg['cancel']}" update="someComponent" 
fileUploadListener="#{someBean.uploadListener}"
multiple="false" sizeLimit="1000000" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />

Тогда у моего компонента есть метод, который обрабатывает событие загрузки файла. Примерно так:

public void fileUpload(FileUploadEvent event) throws IOException {
    String path = FacesContext.getCurrentInstance().getExternalContext()
            .getRealPath("/");
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
    String name = fmt.format(new Date())
            + event.getFile().getFileName().substring(
                  event.getFile().getFileName().lastIndexOf('.'));
    File file = new File(path + "catalogo_imagens/temporario/" + nome);

    InputStream is = event.getFile().getInputstream();
    OutputStream out = new FileOutputStream(file);
    byte buf[] = new byte[1024];
    int len;
    while ((len = is.read(buf)) > 0)
        out.write(buf, 0, len);
    is.close();
    out.close();
}

Сохраните ссылку на путь к файлу, который только что был сохранен, и используйте его для установки соответствующего пользовательского свойства в вашем методе addUserDB (). Так что это действительно двухэтапный процесс. Сначала вы сохраняете файл где-нибудь на сервере, а затем сохраняете своего пользователя.

3 голосов
/ 01 марта 2012

fileUpload имеет fileUploadListener. Обратите внимание, что вы должны реализовать логику для сохранения содержимого файла самостоятельно в компоненте поддержки.

<p:fileUpload fileUploadListener="#{fileBean.handleFileUpload}">

public class FileBean {
    public void handleFileUpload(FileUploadEvent event) {
        UploadedFile file = event.getFile();
        String fileName = file.getFileName();
        long fileSize = file.getSize();
        InputStream myInputStream = file.getInputstream();
        //Save myInputStream in a directory of your choice and store that path in DB
    }
}
...