richfaces fileupload组件是用于文件批量上传的组件,用他做JSF的文件上传是非常方便和高效的.但有些问题需要注意,配置方法如下
1、先修改web.xml配置文件
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
<init-param>
<param-name>createTempFiles</param-name>
<param-value>true</param-value>(此项必须为true否则后台管理bean无法获得文件)
</init-param>
<init-param>
<param-name>maxRequestSize</param-name>
<param-value>4000000</param-value>(此项设置意思是限制上传文件的大小,超过4MB的就不允许上传了,配合后面组件里的某些属性进行控制上传文件大小)
</init-param>
</filter>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
2、jsp页面的写法
<h:panelGroup>
<h:outputText value="能上传扩展名为doc,txt,xls,rar的文件,最大能够上传4MB的文件"/>
<rich:fileUpload fileUploadListener="#{phealthstatute.uploadListener}"
maxFilesQuantity="5" autoclear="false" addControlLabel="添加" immediateUpload="true"
uploadControlLabel="上传" clearAllControlLabel="清除所有" clearControlLabel="清除"
cancelEntryControlLabel="取消" stopControlLabel="停止" stopEntryControlLabel="停止"
noDuplicate="true" listHeight="50" listWidth="500" allowFlash="true" onsizerejected="op();"
style="height:100;" id="upload" doneLabel="上传成功" sizeErrorLabel="文件不能超过4MB,上传失败!" fileEntryClass="fhys" transferErrorLabel="上传失败!"
acceptedTypes="txt,doc,xls,rar">
<a4j:support reRender="info" event="onuploadcomplete" />
</rich:fileUpload>
</h:panelGroup>
其中maxFilesQuantity="5"是表示只能上传五个文件
onsizerejected="op();"意为当选择的文件大小,超过web.xml设置的大小,则执行JS方法op().
sizeErrorLabel="文件不能超过4MB,上传失败!" 意为当选择的文件大小时,上传列表中则显示该提示信息。
transferErrorLabel="上传失败!" 意为传输发生异常未成功时,显示的提示信息。
<a4j:support reRender="info" event="onuploadcomplete" />
该句代码意为当上传文件完毕时即刷新ID为info的组件。通常用来显示上传文件的一些具体显示。
immediateUpload="true" 意为允许自动上传文件,即用户不需要再手动点击上传,只需直接选择文件即可
allowFlash="true" 意为允许按照flash方式上传,主要是显示效果要好看些,有很漂亮的上传进度条。如果不能正常浏览,设为false试试...
fileUploadListener="#{phealthstatute.uploadListener}" 意为当文件上传时调用后台管理bean的监听方法。
3、后台管理bean监听方法的写法
public void uploadListener(UploadEvent event) {
this.setDispMessage("display:none");
try {
UploadItem item =event.getUploadItem();//获取上传的文件对象
String fullFileName = item.getFileName();
fileName = fullFileName.substring(fullFileName.lastIndexOf("//")+1 , fullFileName.length());
String[] names=fileName.split("//.");
PAccessories pa=new PAccessories();//一个pojo类
pa.setCfilename(names[0]);
pa.setCextendname(names[1]);
if(item.getFileSize()>1000){
pa.setCfilesize(((item.getFileSize()/1000)+" kb").toString());
}else{
pa.setCfilesize((item.getFileSize()+" b").toString());
}
filePath = com.fl.flhis.util.ParamList.getInstance().getParamValue("TEMPFILE");
java.io.File saveFile = new java.io.File(filePath, fileName);
if (item.getFileSize() <= 4000000) {//判断小于4MB的文件才处理(这里主要是程序是否处理,其实也可以不要,如果web.xml配置了的话)
FileInputStream fis = new FileInputStream(item.getFile());
FileOutputStream out = new FileOutputStream(saveFile);
int bytes = 0;
byte[] bteFile = new byte[1024];
while ((bytes = fis.read(bteFile)) != -1) {
out.write(bteFile, 0,bytes);
}
out.flush();
fis.close();
out.close();
list.add(pa);
this.setDispMessage("display:none");
}else{
this.setFileName("");
this.setDispMessage("display:");
}
} catch (Exception e) {
e.printStackTrace();
}
}
上面的方法有些还要以减化,其主要代码就是一句UploadItem item =event.getUploadItem();//获取上传的文件对象
其余的就是围着这个对象进行一些读写信息的操作!
个人感觉该组件还是比较好用,而且也比较好看,推荐使用!
用法二:
前沿:JSF本身并没有提供上传组件,如果使用原生的JSF做上传工具,你可能需要做更多的额外操作。幸运的是richfaces知道了我们的苦 衷,它提供了高效可控的上传组件<richfaces:fileUpload/>,下面简单给你大家介绍一下如何使用。
1.web.xml中的配置
如果你需要对文件上传的大小提供阀值控制,可以设定,具体参考richfaces的文档。否则我们不做更多处理。
如果你需要配置的自己的文件系统路径,你可以在context-param中配置路径。
2.page部分:上传组件
上面就是我们的fileUpload上传组件,它的一些属性,很容易理解,当然你可以参考文档。主要看rentPhoto.upload这个侦听器是如何工作的。
3.java部分