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

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

2.page部分:上传组件

 

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

 

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

 

 

 

3.java部分

 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值