use*_*922 7 ajax file-upload primefaces jsf-2
我想上传一个使用PrimeFaces和ManagedBean的文件.我想用p:fileUploadmode ="simple".
XHTML代码:
<p:fileUpload id="fileId" mode="simple" value="#{itemBean.upFile}"
fileLimit="1" />
<p:commandButton ajax="true" value="Upload File" update="messagess"
id="save-btn"
actionListener="#{itemBean.fileUpload(itemBean.upFile,itemBean.hiddenFileName)}"
process="@this" oncomplete="showImage()" />
Run Code Online (Sandbox Code Playgroud)
ManagedBean:
public void fileUpload(UploadedFile uploadFile, String hiddenKey) {
String keyFileName = hiddenKey;
boolean validFile = true;
String expression = "([^\\s]+(\\.(?i)(gif|jpg|jpeg|gif|png|PNG|GIF|JPG|JPEG|bmp))$)";
if((uploadFile == null) ) {
validFile = false;
FacesMessage msg = new FacesMessage("Error! "+ "Please select an image.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
else {
System.out.println("going to file upload"+uploadFile.getFileName()+"---hiddenKey"+keyFileName);
if((!uploadFile.getFileName().matches(expression)) ) {
validFile = false;
FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName() + " is not an image.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
if(uploadFile.getSize() > 1000000) {
validFile = false;
FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName() + " size is too large.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
if (validFile) {
// Do what you want with the file
try {
//String extn =uploadFile.getFileName().substring(uploadFile.getFileName().lastIndexOf("."));
copyFile(uploadFile.getFileName(), uploadFile.getInputstream());
FacesMessage msg = new FacesMessage("Success! "+ uploadFile.getFileName() + " is uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
} catch (IOException e) {
e.printStackTrace();
FacesMessage msg = new FacesMessage("Error! "+ uploadFile.getFileName()+ " not uploaded.");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我点击了命令按钮,并且没有调用辅助bean中的方法.如果我使用ajax="false"该方法被调用,但页面得到了刷新.
如何使用ajax="true"和<p:fileUpload>在一起?
在<p:fileUpload mode="simple">不支持AJAX.对不起,但这是故事的结尾.
如果切换到ajax兼容<p:fileUpload mode="advanced">实际上不是一个选项,那么最好的办法是升级到JSF 2.2并使用其新的原生<h:inputFile>组件.它还显示在浏览器默认的look'n'feel中,并且能够通过隐藏的iframe技巧模拟ajax体验.
与具体问题无关,fileUpload()操作方法中的这两个参数完全没有必要.只是
action="#{itemBean.fileUpload}"
Run Code Online (Sandbox Code Playgroud)
同
public void fileUpload() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
删除process="@this"属性后,效果一样好.
| 归档时间: |
|
| 查看次数: |
16364 次 |
| 最近记录: |