JSF PrimeFaces - 将上传的文件路径存储在另一个bean的属性中

时间:2013-04-12 13:43:00

标签: spring jsf file-upload primefaces path

总结一下:我想上传用户通过<p:fileUpload>使用fileUploadController ManagedBean作为其fileUploadListener的表单传递到某个路径的文件,然后获取此路径以及文件名并以wydarzenieMB ManagedBean以某种方式存储它(问题是 - 如何?)因为我需要filePath作为我的addWydarzenie()方法中的字符串来存储它数据库中的路径,稍后再使用它。

我的数据库中有一个名为“Wydarzenie”的表。它有许多值,如名称等,我在我的JSF表单中指定用户使用primefaces填充。获取它们没有问题,我只使用ManagedBean存储输入,然后使用此输入使用addWydarzenie()方法写入DataBase。

utworzWydarzenie.xhtml表格的一部分:

...
<h:outputLabel for="opis" value="Opis :" />
<p:inputTextarea id="opis" value="#{wydarzenieMB.opis}" label="opis">
...
<p:commandButton id="addWydarzenie" value="Zatwierdź" action="#{wydarzenieMB.addWydarzenie}" ajax="false"/>

我在wydarzenieManagedBean中的addWydarzenie()方法:

public String addWydarzenie() {
    try {
        Wydarzenie wydarzenie = new Wydarzenie();
        ...
        wydarzenie.setOpis(getOpis());
        ...
        getWydarzenieServiceImpl().addWydarzenie(wydarzenie);
        return SUCCESS;
    } catch (DataAccessException e) {
        e.printStackTrace();
    }   

    return ERROR;
}

例如,我使用p:inputText的值没有问题,因为我指定了我想要存储它们的bean的值(例如:value="#{wydarzenieMB.opis}")。问题从我的<p:fileUpload>字段开始,因为:
 1.我没有在那里指定价值,因为没有返回值(?) - 只上传了文件
 2.我使用fileUploadController ManagedBean来处理文件上传但是我希望它拥有的上传文件的filePath字符串存储在我的wydarzenieMB ManagedBean中。

这是我从utworzWydarzenie.xhtml表格上传的文件代码:

...
<h:outputLabel for="plakat" value="Plakat :" />
<p:fileUpload id="plakat" update="messages" fileUploadListener="#{fileUploadController.handleFileUpload}" multiple="false" sizeLimit="1000000" allowTypes="/(\.|\/)(gif|jpe?g|png)$/" />
<p:growl id="messages" showDetail="true"/>
...  

我的fileUploadController类:

@ManagedBean(name="fileUploadController")
@RequestScoped
public class FileUploadController 
{  
private String destination="E:/PROJEKT ZESPOLOWY/events/WebContent/resources/plakaty/";
private String sciezkaPliku = "";           // complete file path including destination and file name

public void handleFileUpload(FileUploadEvent event) throws IOException { 
    FacesMessage msg = new FacesMessage("Plik: ", event.getFile().getFileName() + " został poprawnie wysłany na serwer.");
    FacesContext.getCurrentInstance().addMessage(null, msg);

    String path = destination;

    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmss");
    String name = fmt.format(new Date())
            + event.getFile().getFileName().substring(
                  event.getFile().getFileName().lastIndexOf('.'));
    File file = new File(path + name);

    sciezkaPliku += path + name;            // I set file path here

    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();
}   

public String getSciezkaPliku() {
    return sciezkaPliku;
}

public void setSciezkaPliku(String sciezkaPliku) {
    this.sciezkaPliku = sciezkaPliku;
}
}  

它被声明为ManagedBean,因为我试图从sciezkaPliku访问其wydarzenieMB变量文件路径,如下所示:

@ManagedProperty(value="#{fileUploadController.sciezkaPliku}")
private String plakat;

但它总是空的。我还尝试在wydarzenieMB内获得整个fileUploadController并使用它的setter方法:

@ManagedBean(name="fileUploadController")
@RequestScoped
public class FileUploadController 
{  
    @ManagedProperty(value="#{wydarzenieMB}")
    WydarzenieManagedBean w;

    public void handleFileUpload(FileUploadEvent event) throws IOException { 

        ...
        sciezkaPliku += path + name;            // I set file path here
        w.setPlakat(sciezkaPliku);
        ...

    }
    ...
}

但它也没有成功。文件上传并保存在指定的文件夹中没有问题,当我从sciezkaPliku打印handleFileUpload时没关系,但是当我使用addWydarzenie()创建新的Wydarzenie时,它总是{{ 1}}。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果我清楚地理解了您的问题,建议您将范围更改为&#34; @ SessionScoped&#34; FileUploadController 。我有同样的问题,这是通过这种方式解决的。

检查出来并通知我结果;)