`
xumingrencai
  • 浏览: 1177390 次
文章分类
社区版块
存档分类
最新评论

richfaces fileupload组件的使用方法

 
阅读更多

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中配置路径。

Xml代码
  1. < context-param >
  2. < param-name > rentImagesPath </ param-name >
  3. < param-value > /images/site/rent/ </ param-value >
  4. </ context-param >

2.page部分:上传组件

Java代码
  1. <rich:fileUploadfileUploadListener= "#{rentPhoto.upload}" maxFilesQuantity= "#{rentPhoto.uploadsAvailable}"
  2. id="upload" immediateUpload= "#{rentPhoto.autoUpload}" acceptedTypes= "jpg,gif,png,bmp" allowFlash= "true"
  3. listWidth="500px" listHeight= "100px" autoclear= "true" status= "operStatus"
  4. transferErrorLabel="传输出错--文件过大或名称错误!" >
  5. <!--上传成功后,刷新图片列表,当然这个组件只是点缀,本文不作介绍-->
  6. <a4j:supportevent="onuploadcomplete" reRender= "photoList" />
  7. </rich:fileUpload>

上面就是我们的fileUpload上传组件,它的一些属性,很容易理解,当然你可以参考文档。主要看rentPhoto.upload这个侦听器是如何工作的。

3.java部分

Java代码
  1. import org.richfaces.event.UploadEvent;
  2. import org.richfaces.model.UploadItem;
  3. public class RentPhoto{
  4. .....
  5. public void upload(UploadEventevent) throws Exception{
  6. FacesContextcontext=FacesContext.getCurrentInstance();
  7. ExternalContextec=context.getExternalContext();
  8. //获取servlet,其实你可以一步到位获取
  9. ServletContextsc=(ServletContext)ec.getContext();
  10. //上传项,item里封装了上传文件的所有数据,同时包含http数据
  11. UploadItemitem=event.getUploadItem();
  12. Datedate=new Date(System.currentTimeMillis());
  13. //解码文件名,当文件命中有中文等其他字符时,你必须这么做
  14. Stringtemp_path=java.net.URLDecoder.decode(item.getFileName(),"utf-8" );
  15. //找到文件名,如下操作,你可以根据自己的需要进行优化,具体可以看看javaAPI中I/O流File
  16. if (temp_path.lastIndexOf( '.' )< 0 ){
  17. return ;
  18. }
  19. if (item.getFileSize()> 512000 ){
  20. return ;
  21. }
  22. //重命名文件,保留格式。如果你有自己的压缩工具、水印等操作,在此可以加入。。MD5方法是自己写的,你可以使用其他的重命名文件的方案
  23. StringfileName=MD5.Md5(date.toString())+temp_path.substring(temp_path.lastIndexOf('.' ));
  24. //web站点,简单文件系统路径,web.xml中配置
  25. FileOutputStreamout=new FileOutputStream(sc.getRealPath(sc.getInitParameter( "rentImagesPath" ))+ "/" +fileName);
  26. out.write(item.getData());
  27. out.close();
  28. //保存文件名到数据库,文件保存在文件系统中。以下代码仅供参考,请使用自己的数据库操作方式:保存文件的文件名到系统.如果你没有设置文件系统,可以把图片保存在数据库中
  29. Sessionsession=HibernateInit.currentSession();
  30. RPhotophoto=new RPhoto(fileName,rent.getId());
  31. new RPhotoOper().update(session,photo);
  32. HibernateInit.closeSession();
  33. //异步操作,加入列表
  34. photoList.add(photo);
  35. }
  36. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics