`

JSF实现文件上传

    博客分类:
  • JSF
jsf 
阅读更多
 目前 JSF 对于档案上传的支持很差,JSC 内更是缺少档案上传的组件
除非使用 Orcale ADF 的组件,但是 Oracle ADF 并非免费的。
本篇文章主要就是跟大家分享如何在 JSF 内使用免费的 Jakarta Commons FileUpload (http://jakarta.apache.org/commons/fileupload/ ) 组件来实作档案上传功能。
有几点注意事项,这边必须先要提出的:
1. Servlet 部分改自本讨论区 JiaYun 大大的「档案上传 JSP 小范例」,希望他不会介意!^^" (如果需要更清楚的 Jakarta Commons FileUpload 范例,那篇文章

会是更好的选择。)
2. 档案上传,必须把 form 的 enctype 更改如下:

<h:form binding="#{AttachFile.form1}" enctype="multipart/form-data" id="form1">


但是以上的 JSF 标签 compile 都会正常,但是在这个 form 里面,其它组件的 action 都会无法正常触发。所以这边仅使用一般的 JSP 页面。
3. 这篇献丑的教学其实是使用 JSF(其它页面) -> JSP(选择档案页面) -> Servlet(储存使用者上传的档案) -> JSF(其它页面) 的流程。
说穿了,只是使用旧的 JSP + Servlet 技术,请各位高手海涵。

 流程一(选择档案的 JSP 页面):

<f:verbatim>
     <form action="UploadFile" enctype="multipart/form-data" method="post">
       File:<input name="txtFile" type="file"/><br/>                       
       Description:<input name="txtDesc" type="text"/><br/>
       <input type="checkbox" name="chkAdd"/>Add another file<br/>
       <input style="height: 27px; left: 0px; top: 96px; position: absolute; width: 72px" type="submit" value="Add"/>
       <input style="height: 27px; left: 96px; top: 96px; position: absolute; width: 72px" type="submit" value="Cancel"/>
     </form>
</f:verbatim>               
<h:form binding="#{AttachFile.form1}" id="form1"/>

 1. 这个页面包含:
一个 type="file" 的 textbox
一个一般的 textbox 提供为输入档案描述
一个 checkbox,提供多重上传档案
一个 Add 及一个 Cancel 的 Button
2. 如果使用者选取 checkBox,在后面的 Servlet 处理完,则回到这一页 ,选择另一个上传的档案。 如果没有勾选,则前进到其它的 JSF 页面。
3. UploadFile 为后面要处理档案储存的 Servlet 名称。
4. 以上只写出修改的地方,其它 JSF 预设的 tag 就不写出来了。

 流程二(web.xml):
<servlet>
     <servlet-name>Upload_File</servlet-name>
     <servlet-class>webapplication1.UploadFile</servlet-class>
</servlet>
<servlet-mapping>
     <servlet-name>Upload_File</servlet-name>
     <url-pattern>/UploadFile</url-pattern>
</servlet-mapping>
1. 请把这一段程序代码与 web.xml 内的其它 servlet tag 放在一块,比较不会出问题。
2. 这段大致的意义为:当你向 server 要求 /UploadFile 这个 URL 时, server 会使用 webapplication1.UploadFile 这个 servlet 来处理你的要求。

 流程三(后端处理档案的 Servlet):
UploadFile
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;

public class UploadFile extends HttpServlet{
       public void doPost(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws ServletException, IOException {
         //取得 JSF 的 SessionBean
         SessionBean1 sesBean=(SessionBean1)servletRequest.getSession().getAttribute("SessionBean1");
         //取得 JSF 的 ApplicationBean
         ApplicationBean1 appBean=(ApplicationBean1)getServletContext().getAttribute("ApplicationBean1");
         // 宣告将上传之档案放置到服务器的 / .... /upload 目录中
         //String saveDirectory = appBean.getAttachPath();
         // 宣告暂存目录
         //String tmpDirectory = "c:\\";
         // 宣告限制上传之档案总大小为, 单位为 byte, -1 表示无限制
         int maxPostSize = -1;
         // 宣告储存叙述上传档案内容的变量
         String FileDescription = "";
         // 宣告是否接下来要继续新增档案
         boolean hasMore = false;
         // 宣告储存上传文件名称的变量
         String FileName = "";
         // 宣告储存上传档案大小的变量
         long FileSize = 0;
         // 宣告储存上传档案型态的变量
         //String ContentType = null;
         // 计算上传档案之个数
         int count = 0 ;

         try {
           DiskFileUpload upload = new DiskFileUpload();
           // 处理中文档名问题
           upload.setHeaderEncoding("UTF-8");
           // 设定内存存放数据的大小, 超过则写入档案, 有设定暂存目录, 暂存盘置于暂存目录下
           //upload.setSizeThreshold(4096);
           // 设定总上传大小限制
           //upload.setSizeMax(maxPostSize);
           // 设定暂存目录
           //upload.setRepositoryPath(tmpDirectory);
           List items =upload.parseRequest((HttpServletRequest)servletRequest);
           Iterator iter = items.iterator();
           FileItem fItem=null;
       
           while(iter.hasNext()) {
                   FileItem item = (FileItem) iter.next();
                   if (item.isFormField()) {
                       // 一般字段
                       if(item.getFieldName().equalsIgnoreCase("txtDesc")) {
                           // 取得档案叙述
                           FileDescription = item.getString("UTF-8");
                       }
                       else if(item.getFieldName().equalsIgnoreCase("chkAdd")) {
                           // 取得接下来将前往的页面
                           hasMore = item.getString().equalsIgnoreCase("on") ? true: false;
                       }
                   }
                   else {
                       // 档案字段
                       // 否则取得档案信息
                       FileName = item.getName();
                       // 因为不同的浏览器会造成传递 path + filename, 有些则只有 filename
                       // for wintel platform
                       FileName = FileName.substring(FileName.lastIndexOf("\\")+1);
                       // for unix-like platform
                       FileName = FileName.substring(FileName.lastIndexOf("/")+1);
                   
                       //ContentType = item.getContentType();
                       FileSize = item.getSize();                   
                   
                       fItem=item;
                   }
               }

               //--Delete--
               //如果需要的话
               //你可以在这里使用前面取得的 SessionBean 及 ApplicationBean
               //里面的参数对你的数据库做操作,并把档案描述在这里存入数据库
           
               //写入档案
               File uploadedFile = new File(appBean.getAttachPath() + FileName);
               fItem.write(uploadedFile);           
           }
           catch(Exception ex) {
             //例外处理           
           }
           //导向不同的页面
           finally {
               if(hasMore)
                   servletResponse.sendRedirect("faces/AttachFile.jsp");
               else
                   servletResponse.sendRedirect("faces/Schedule.jsp");
           }
       }
}
1. 前面的取得 SessionBean1 及 ApplicationBean1,看个人需要,如果你需要取得 JSF 内的 SessionBean 及 ApplicationBean,可以参考这个用法。
2. 最后的 servletResponse.sendRedirect 会根据前面的 JSP 页面,是否有勾选 chkAdd 来决定是要回到前面的 JSP 页面来继续新增档案,或是前往其它 JSF 页面。
3. 请注意 faces/Schedule.jsp 前面的 faces ,如果不加可能可会出现 Cannot find FacesContext 的错误。
分享到:
评论

相关推荐

    JSF实现的文件上传

    下面将详细介绍如何使用JSF实现文件上传,以及涉及到的关键技术和注意事项。 ### 1. JSF的文件上传组件 JSF提供了`&lt;h:inputFile&gt;`组件来实现文件上传的功能。这个组件允许用户选择本地文件,并将其上传到服务器。...

    JSF上传 JSF大文件上传 JSF上传代码 JSF上传源代码

    为了实现JSF的大文件上传,开发者通常需要借助第三方库,如Apache Commons FileUpload或者PrimeFaces的FileUpload组件。这些组件提供了分块上传的能力,将大文件切割成小块进行传输,从而避免一次性加载整个文件到...

    使用JSF和MyFaces实现文件上载

    ### 使用JSF和MyFaces实现文件上传 #### 一、理解文件上传机制 在Web开发中,文件上传主要通过HTML表单实现,其中`&lt;input type="file"&gt;`元素用于让用户选择文件。当表单提交时,浏览器将表单数据编码为`multipart/...

    jsf+ajax实现文件上传

    jsf结合ajax实现文件上传,值得阅读

    jsf2.0 文件上传组件

    由于JSF2.0标准实现没有提供文件上传组件,而实际应用中很多时候需要上传文件,为了方便开发,我做了一个基于JSF2.0的文件上传组件,上传使用的是Apache 的commons-fileupload组件,我已经将commons-fileupload-...

    JSF 上传文件例子

    总之,尽管JSF在原生支持文件上传方面存在不足,但通过开发自定义组件或利用第三方库,开发者可以有效地实现文件上传功能,以满足其应用程序的需求。理解这一过程有助于提升JSF开发者的技能,并能更好地应对实际项目...

    JSF文件上传

    在这个场景中,我们讨论的是如何使用JSF实现文件上传功能。 首先,为了实现文件上传,我们需要依赖几个关键的库文件。这些文件包括`tomahawk-1.1.3.jar`、`commons-fileupload-1.2.jar`和`commons-io-1.3.1.jar`。...

    jsf 文件上传和下载

    本文将详细介绍如何在JSF环境中实现文件上传和下载,并提供一个可直接在Eclipse下用Tomcat运行的例子。 一、文件上传 1. **依赖库**:在JSF中处理文件上传,我们需要引入Apache Commons FileUpload库,它提供了...

    jsf上传文件用到的包

    在JSF(JavaServer Faces)框架中实现文件上传功能,通常会涉及到多个依赖库,以处理文件上传的各个阶段,包括文件的解析、临时存储以及后续的业务逻辑处理。在这个场景下,`JSF上传文件用到的包`指的是一个项目中...

    JSF自定义文件上传组件

    jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2...fileupload1.1)开发了一个文件上传组件。

    JSF文件上传下载

    以上就是JSF文件上传和下载的基本实现。为了确保安全性和性能,还需要考虑错误处理、文件大小限制、临时文件管理以及用户权限控制等细节。同时,现代的Web开发中,还可能结合使用CDN(内容分发网络)和云存储服务来...

    jsf实现基于ajax的上传例子

    // 实现文件上传逻辑 // 更新进度 // ... } public String getProgress() { // 获取当前上传进度 // ... } } ``` 3. **配置Servlet映射**:在 `web.xml` 中配置用于获取文件上传进度的Servlet。 ```...

    jsf文件上传

    JSF(JavaServer Faces)是Java平台上的一个用于构建用户界面的组件模型框架,尤其...总的来说,JSF文件上传涉及前端组件、后端处理、配置和库的结合,通过这种方式,开发者可以方便地在JSF应用中实现文件上传功能。

    用JSF和MyFaces上传文件

    MyFaces则是一个开源的JSF实现,它扩展了JSF的基本功能,包括提供了一套丰富的UI组件,这些组件可以与Apache Commons File Upload结合使用,以实现文件上传功能。MyFaces的某些组件可能会直接使用Apache Commons ...

    一个上传文件的jsf组件

    本篇文章将深入探讨如何使用JSF组件实现文件上传功能,并结合描述和标签来阐述这一主题。 首先,我们需要理解JSF组件的工作原理。JSF是一种基于Java的MVC(模型-视图-控制器)框架,用于构建动态的、数据驱动的Web...

    JSF页面,<p:fileUpload组件文件上传

    其中,`&lt;p:fileUpload&gt;`组件是用于实现文件上传功能的一个重要元素。本篇文章将深入探讨如何使用PrimeFaces的`&lt;p:fileUpload&gt;`组件在JSF应用中实现实时、便捷的文件上传。 首先,让我们了解`&lt;p:fileUpload&gt;`的基本...

    JSF+primefaces 网盘实现代码前端

    例如,我们可以利用PrimeFaces的FileUpload组件来实现文件上传功能,用户可以通过浏览器直接选择文件并将其上传到服务器。 HTML、CSS和JavaScript作为前端的基础技术,各自扮演着关键角色。HTML负责页面结构,CSS...

    jsf2.0上传组件(servlet3.0)

    在本文中,我们将深入探讨如何使用JavaServer Faces (JSF) 2.0与Servlet 3.0结合实现文件上传功能。JSF是Java平台上的一种Web应用程序开发框架,而Servlet 3.0则是用于处理HTTP请求的核心Java API,两者结合可以提供...

    jsf 上传 操作Excel 导入数据库中 浏览器打开Excel表格

    首先,我们需要了解JSF中的文件上传组件。JSF提供了一些内置的组件,如`&lt;h:inputFile&gt;`,用于在用户界面中创建一个文件上传表单。用户选择Excel文件后,文件会被暂时存储在服务器的临时目录中。 接着,我们需要处理...

Global site tag (gtag.js) - Google Analytics