Java Web程序开发范例宝典
上QQ阅读APP看书,第一时间看更新

1.6 文件域

文件域是form表单中一个非常重要的元素,它肩负着文件和图片上传的功能。在应用这个元素时必须在form标签中指定enctype="multipart/form-data"属性,否则不能实现上传的操作。下面通过几个具体的实例介绍在JSP中应用文件域的技巧。

实例023 通过文件域同时上传多个图片

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\01\023

实例说明

在编写程序时,经常会应用到上传文件或者上传图片的功能。而无论文件还是图片的上传都要应用到form表单中的文件域,都需要通过文件域来进行提交。在本实例中介绍一种可以同时上传多个图片的方法,当然也可以每次上传一个图片,只要不超过其最大值就没有问题。运行结果如图1.32所示。

图1.32 通过文件域同时上传多个图片

技术要点

本实例主要应用form表单中的文件域提交图片,然后应用jspSmartUpload组件实现将提交的图片存储到服务器指定的文件夹下。

(1)应用jspSmartUpload组件中File类的isMissing()和getFileName()方法,判断用户是否选择了文件和获取文件的文件名。

(2)应用jspSmartUpload组件中Files类的getCount()和getFile()方法,获取上传文件的数目和获取指定的File对象。

(3)应用jspSmartUpload组件中Request类的getParameter()方法获取指定表单元素的值。(4)通过jspSmartUpload组件中SmartUpload类提供的方法实现图片的上传以及对上传图片大小和格式的判断。

技巧:在创建上传图片的form表单时,必须添加“enctype="multipart/form-data"”属性,否则将不能进行上传的操作。

实现过程

(1)创建上传图片的form表单,添加文件域元素,设置enctype="multipart/form-data"属性,关键代码如下:

        <form name="form1" method="post" action="Upfile_Picture" enctype="multipart/form-data">
          <tr>
              <td width="314" align="center">图片(1)
              <input name="picture1" type="text" id="picture1" size="18"></td>
              <td width="332">选择图片:
              <input name="files1" type="file" id="files1"></td>
          </tr>
          <tr>
              <td align="center">图片(2)
              <input name="picture2" type="text" id="picture2" size="18"></td>
              <td>选择图片:
              <input name="files2" type="file" id="files2"></td>
          </tr>
          <tr>
          <td align="center">图片(3)
          <input name="picture3" type="text" id="picture3" size="18"></td>
          <td>选择图片:
          <input name="files3" type="file" id="files3"></td>
          </tr>
          <tr>
          <td align="right"><a href="index_ok.jsp" target="_blank">浏览图片</a>&nbsp;</td>
          <td align="left">&nbsp;<input type="submit" name="Submit" value="提交"></td>
          </tr>
        </form>

(3)创建Upfile_Picture类,实现将上传的图片存储到服务器指定的文件夹下,并且将上传图片在服务器指定文件夹下的路径添加到数据库中,用于实现对上传图片的浏览。关键代码如下:

        public class Upfile_Picture extends HttpServlet {
            private String filedir = null;
            private long maxsize;
            private String types = null;
            public void init() throws ServletException {
                filedir=getInitParameter("filedir");                            //初始化上传文件的路径
                maxsize=Long.valueOf(getInitParameter("maxsize"));              //初始化上传文件的大小
                types=getInitParameter("type");                                 //初始化上传文件的类型
            }
            public void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                doPost(request, response);
            }
            public void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                PrintWriter out = response.getWriter();
                UserDao conn=new UserDao();                                       //实例化操作数据库类
                SmartUpload su=new SmartUpload();                                 //实例化上传文件类
                try {
                    su.initialize(this.getServletConfig(),request,response);    //应用initialize
                    su.setMaxFileSize(maxsize);                                 //限制上传文件大小
                    su.setAllowedFilesList(types);                              //设置上传文件的类型
                    su.upload();                                                //实现上传功能
                    Files files=su.getFiles();                                   //实例化Files类
                      //通过Files类中的getCount方法获取上传图片的数目,并通过for语句循环输出
                    for (int i = 0; i < files.getCount(); i++) {
                        File singlefile=files.getFile(i);        //实例化File类
                        if(!singlefile.isMissing()){            //通过File类中的isMissing()方法判断用户是否选择了文件
                          String file_picture=su.getRequest().getParameter("picture"+(i+1));  //获取指定元素的名称
                          //定义上传文件在服务器中的存储路径,通过File类中的getFileName方法获取上传文件的文件名
                          String file_path = filedir + singlefile.getFileName();
                          //将上传图片在服务器中存储的路径添加到数据库中
                          String sqls = "insert into tb_picture (picture_name,file_path)values('" + file_picture + "','" + file_path + "')";
                          conn.executeUpdate(sqls);
                        }
                    }
                    su.save(filedir);  //上传文件
                    out.println("<script >alert('上传图片成功!'); window.location.href='index_ok.jsp';</script>");
                } catch (Exception e) {
                    if (e.getMessage().indexOf("extension") != -1) {
                        out.println("<script >alert('上传文件的格式不正确!'); window.location.href='index.jsp';</script>");
                    }
                    if (e.getMessage().indexOf("Size exceeded for this file") != -1) {
                        out.println("<script >alert('文件大小超出范围!'); window.location.href='index.jsp';</script>");
                    }
                    e.printStackTrace();
                }
            }
        }

(4)创建index_ok.jsp页面,应用javaBean标签,调用数据库操作类,循环输出上传图片。关键代码如下:

        <%@page contentType="text/html" pageEncoding="GBK" import="java.sql.ResultSet" %>
        <jsp:useBean id="mysql" class="com.pkh.dao.UserDao"/>
        <table width="750" border="0" cellspacing="0" cellpadding="0">
            <tr>
                      <td align="center"></td>
                <%
        String sql = "select * from tb_picture";
        ResultSet rs = mysql.selectStatic(sql);
        if (rs.next()) {
            int i = 0;
            rs.previous();
            while (rs.next()) {
                if ((i % 3) == 0) {
                      %>
            </tr>
            <tr>
                <%  }   %>
                <td>
                  <table width="250" border="1" cellpadding="1" cellspacing="1">
                      <tr>
                          <td align="center">图片名称:<%=rs.getString("picture_name")%></td>
                      </tr>
                      <tr>
                          <td><img src="<%=rs.getString("file_path")%>" width="240" height="200"></td>
                      </tr>
                  </table>              </td>
                <%
                      if ((i % 3) != 0) {
                      }
                      i++;
                  }
                      %>
            </tr>
            <%
                } else {
            %>
            <tr><td align="center">没有数据!</td></tr>
            <%    }   %>
        </table>

举一反三

根据本实例,读者可以:

在商品信息添加页面中实现图片文件上传;

开发商品信息维护页面。

实例024 设置文件域的初始值

本实例是一个提高效率、人性化的程序

实例位置:光盘\mingrisoft\01\024

实例说明

上传文件或者图片是很多程序员都开发过的功能,大家应该注意到,当上传成功后,文件域中本地文件的存储路径消失了,如果想重新上传或者查看该文件在本地的存储位置,那就要重新单击“浏览”按钮在本地文件中进行查找。本实例将介绍一种获取文件域初始值的方法,即当文件上传成功后,上传文件选择的本地文件仍然出现在文件域中,这样就可以直接进行查看文件位置或者重新上传。运行结果如图1.33所示。

图1.33 设置文件域的初始值

技术要点

本实例主要应用clipboardData对象中的getData()和setData()方法,在执行上传操作的过程中通过onClick()事件调用setData()方法,将上传文件的值定义到剪贴板中,然后在上传成功返回到本页时通过onLoad()事件调用自定义方法setFileFieldValue(),将剪贴板中的值强制复制到文件域中。

clipboardData对象中支持的方法如表1.8所示。

表1.8 clipboardData对象中支持的方法

getData方法,实现从剪贴板中获取指定格式的数据。语法如下:

        sRetrieveData = object.getData(sDataFormat)

参数sDataFormat指定剪贴板中数据的格式,包括text和url两种。返回值是dataTransfer或clipboardData对象。

SetData方法,实现以指定的格式给对象赋予数据。语法如下:

        bSuccess = object.setData(sDataFormat, sData)

参数sDataFormat,设置赋予数据的格式,包括text和url两种,参数sData是为对象赋予的参数值。成功则返回更多数据,失败则没有返回数据。

自定义方法setFileFieldValue()的语法如下:

        function setFileFieldValue(){                             //为文件域设置value值
            var WshShell=new ActiveXObject("WScript.Shell");
            var files=window.clipboardData.getData('Text');       //获取剪贴板中存储的文件域地址
            window.clipboardData.setData('text',files);          //将files的值重新載入到剪贴板
            document.getElementById("files").focus();            //获取files的焦点
            WshShell.sendKeys("^v");                             //将值赋給文件域
        }

实现过程

(1)创建index.jsp页面,在body标签中通过onLoad事件调用自定义方法,添加form表单,设置上传文件使用的文件域,在按钮元素中通过onClick事件调用setData()方法获取文件域的值。关键代码如下:

        <script type="text/javascript" src="js/upload.js"></script>
        <body onLoad="setFileFieldValue()">
            <table width="1004" height="650" border="0" background="images/bg.jpg">
            <form action="Upfile_Picture" name="form1" method="post" enctype="multipart/form-data">
                      <tr>
                          <td align="center" valign="top"><p>选择文件:
                        <input name="files" type="file" size="30">
                        <input name="btn_upload" type="submit"
        onClick="window.clipboardData.setData('text',form1.files.value)" value="上传"></p>
                          </td>
                      </tr>
            </form>
            </table>
        </body>

(3)创建Upfile_Picture类,实现将上传的图片存储到服务器指定的文件夹下,并对上传文件的格式和大小进行限制,最后上传成功返回index.jsp页面。关键代码如下:

        public class Upfile_Picture extends HttpServlet {
                private String filedir = null;
                private long maxsize;
                private String types = null;
                public void init() throws ServletException {
                filedir=getInitParameter("filedir");                                 //初始化上传文件的路径
                maxsize=Long.valueOf(getInitParameter("maxsize"));                   //初始化上传文件的大小
                types=getInitParameter("type");                                      //初始化上传文件的类型
                }
                public void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                doPost(request, response);
                }
                public void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                PrintWriter out = response.getWriter();
                SmartUpload su=new SmartUpload();                                      //实例化上传文件类
                try {
                    su.initialize(this.getServletConfig(),request,response);         //应用initialize
                    su.setMaxFileSize(maxsize);                                      //限制上传文件大小
                    su.setAllowedFilesList(types);                                   //设置上传文件的类型
                    su.upload();                                                     //实现上传功能
                    su.save(filedir);                                                //上传文件
                    out.println("<script >alert('上传图片成功!'); window.location.href='index.jsp';</script>");
                } catch (Exception e) {
                    if (e.getMessage().indexOf("extension") != -1) {
                        out.println("<script >alert('上传文件的格式不正确!'); window.location.href='index.jsp';</script>");
                    }
                    if (e.getMessage().indexOf("Size exceeded for this file") != -1) {
                        out.println("<script >alert('文件大小超出范围!'); window.location.href='index.jsp';</script>");
                    }
                    e.printStackTrace();
                }
                }
        }

(4)配置web.xml文件,通过过滤器实现字符编码格式的转换;通过Servlet实现文件上传的操作,并且设置上传文件的格式和大小的初始值,以及文件在服务器中的存储路径。关键代码如下:

            <!—通过过滤器实现编码转换-->
            <filter>
                <filter-name>CharacterEncodingFilter</filter-name>
                <filter-class>com.pkh.charset.CharacterEncodingFilter</filter-class>
                <init-param>
                      <param-name>encoding</param-name>
                <param-value>gbk</param-value>
                </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>REQUEST</dispatcher>
            <dispatcher>FORWARD</dispatcher>
            <dispatcher>INCLUDE</dispatcher>
        </filter-mapping>
        <servlet>
            <servlet-name>Upfile_Picture</servlet-name>
            <servlet-class>com.pkh.servlet.Upfile_Picture</servlet-class>
            <!—设置上传文件的大小-->
            <init-param>
                <param-name>maxsize</param-name>
                <param-value>2097152</param-value>
            </init-param>
            <!—设置上传文件的格式-->
            <init-param>
                <param-name>type</param-name>
                <param-value>JPG,jpg,gif,bmp,BMP</param-value>
            </init-param>
            <!—设置上传文件的存储位置-->
            <init-param>
                <param-name>filedir</param-name>
                <param-value>upload/</param-value>
            </init-param>
        </servlet>
            <servlet-mapping>
            <servlet-name>Upfile_Picture</servlet-name>
            <url-pattern>/Upfile_Picture</url-pattern>
        </servlet-mapping>

举一反三

根据本实例,读者可以:

在电子商务的商品管理中应用;

在企业的OA管理系统中实现上传员工图片中应用。