ITPUB??ì3
2010数据库技术大会
ITPUB论坛 » Java web开发及框架技术 » Struts上传多个及N个文件的例子


您有 2 条公共消息
  • 来自: 公共消息 标题: 3-5月ITPUB数据库 ... 内容: ITPUB与3月和5月分别安排了Oracle 11g DBA和Oracle性能优化培训,以及 ...
  • 来自: 公共消息 标题: ITPUB邮箱已经恢复 内容: ITPUB邮箱用户请注意,邮箱现在已经恢复 web访问地址 http://emai ...

    标题: [转载] Struts上传多个及N个文件的例子
    离线 马甲走江湖
    江湖任我行


    精华贴数 4
    个人空间 70
    技术积分 19717 (64)
    社区积分 26287 (62)
    注册日期 2006-10-26
    论坛徽章:167
    管理团队成员金牌徽章银牌徽章铜牌徽章2008欧洲杯之星欧洲冠军杯纪念徽章
    蓝色妖姬紫蜘蛛九尾狐狸玉石琵琶玉兔嫦娥

    发表于 2006-11-9 07:54 
    Struts上传多个及N个文件的例子

    最近一个基于Struts的项目中要用到上传多张图片到系统中,我在网上找了一下,发现大多数都是转载的例子,对项目的作用不大,故写下了这个例子,希望对有用到的朋友有所帮助。要求JDK1.5以上,lib库要包含如下jar文件:antlr.jar,commons-beanutils.jar,commons-collections.jar,commons-digester.jar,commons-fileupload.jar,commons-logging.jar,commons-validator.jar,jakarta-oro.jar,struts.jar这些都是Struts中的jar文件以及Struts中的标签库文件。
        //可以转载,请保留出自http://www.javaresearch.org,作者anEngineer

    一。web.xml文件
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app
      PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
      "http://java.sun.com/dtd/web-app_2_3.dtd">

    <web-app>
        <servlet>
            <servlet-name>actionServlet</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
                 <param-name>config</param-name>
                 <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
            <init-param>
                 <param-name>debug</param-name>
                 <param-value>2</param-value>
            </init-param>
            <load-on-startup>0</load-on-startup>
        </servlet>
        <!-- struts actionServlet mapping-->
        <servlet-mapping>
            <servlet-name>actionServlet</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
        <!-- welcome file list -->
        <welcome-file-list>
             <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
        <!-- error handle -->
        <error-page>
             <error-code>404</error-code>
             <location>/error.jsp</location>
        </error-page>
    </web-app>

    二。struts-config.xml文件

    <?xml version="1.0" encoding="ISO-8859-1" ?>   
    <!DOCTYPE struts-config PUBLIC
              "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
              "http://struts.apache.org/dtds/struts-config_1_2.dtd">
    <struts-config>
         <!-- form beans -->
         <form-beans>
             <form-bean name="uploadForm" type="org.apache.struts.action.DynaActionForm">
                <form-property name="type" type ="java.lang.String[]"/>
                <form-property name="name" type ="java.lang.String[]"/>
                  <form-property name="file0" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file1" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file2" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file3" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file4" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file5" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file6" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file7" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file8" type ="org.apache.struts.upload.FormFile"/>
                <form-property name="file9" type ="org.apache.struts.upload.FormFile"/>
             </form-bean>
         </form-beans>
         <!-- forward -->
         <global-forwards>
              <forward name= "successed" path="/index.jsp"></forward>   
              <forward name= "failed" path="/error.jsp"></forward>   
         </global-forwards>
         <!-- action handle-->
         <action-mappings>
              <action path="/uploaded" type="com.fangchuang.action.UploadAction"
                      name="uploadForm" scope="request" input="/upload.jsp">
                    <forward name="uploaded" path="/upload.jsp"></forward>
              </action>
         </action-mappings>
    </struts-config>


    __________________
    只看该作者    顶部
    离线 马甲走江湖
    江湖任我行


    精华贴数 4
    个人空间 70
    技术积分 19717 (64)
    社区积分 26287 (62)
    注册日期 2006-10-26
    论坛徽章:167
    管理团队成员金牌徽章银牌徽章铜牌徽章2008欧洲杯之星欧洲冠军杯纪念徽章
    蓝色妖姬紫蜘蛛九尾狐狸玉石琵琶玉兔嫦娥

    发表于 2006-11-9 07:54 
    三。upload.jsp文件
    <%@ page language="java" import="java.util.*" pageEncoding="gb2312" errorPage="error.jsp"%>

    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html"%>
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>
    <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
    <%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="title"%>

    <!-- 上传多个文件的jsp文件
         //可以随便转载,请保留出自http://www.javaresearch.org 作者anEngineer
    -->
    <html>
    <head>
    <title>上传多个文件的jsp文件</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="struts,多个文件,上传">
    <meta http-equiv="description" content="This is a test">
    </head>
    <body>

    <html:form action="uploaded.do" enctype="multipart/form-data" method="post">
        <table border="1" width="80%" align="center">
            <tr bgColor=#62bcff>
                <td align="left">文件类型</td>
                <td align="left">文件描述</td>
                <td align="left">文件名</td>
            </tr>

            <tr>
                <td align="left"><select name="type">
                    <option value="1" selected>湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file0" size="35" value="">
                </td>
            </tr>


            <tr>
                <td align="left"><select name="type">
                    <option value="1"selected>湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file1" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2"selected>湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file2" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2"selected>湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file3" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3"selected>广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file4" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3"selected>广东省</option>
                    <option value="4">北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file5" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4"selected>北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file6" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4"selected>北京市</option>
                    <option value="5">上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file7" size="35" value="">
                </td>
            </tr>
            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5"selected>上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file8" size="35" value="">
                </td>
            </tr>


            <tr>
                <td align="left"><select name="type">
                    <option value="1">湖南省</option>
                    <option value="2">湖北省</option>
                    <option value="3">广东省</option>
                    <option value="4">北京市</option>
                    <option value="5"selected>上海市</option>
                </select></td>

                <td align="left"><input type="text" name="name" value=""></td>

                <td align="left"><input type="file" name="file9" size="35" value="">
                </td>
            </tr>

            <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left"><input type="submit" value="上传文件" value="submit"
                    onclick="return(confirm('你确认要上传文件吗?'))"></td>
            </tr>

        </table>
    </html:form>

    </body>
    </html>


    __________________
    只看该作者    顶部
    离线 马甲走江湖
    江湖任我行


    精华贴数 4
    个人空间 70
    技术积分 19717 (64)
    社区积分 26287 (62)
    注册日期 2006-10-26
    论坛徽章:167
    管理团队成员金牌徽章银牌徽章铜牌徽章2008欧洲杯之星欧洲冠军杯纪念徽章
    蓝色妖姬紫蜘蛛九尾狐狸玉石琵琶玉兔嫦娥

    发表于 2006-11-9 07:54 
    四。还有两个简单jsp文件index.jsp,error.jsp可以自己写。

    五。action文件

    package com.fangchuang.action;
    /**
    * @author anEngineer 处理上传文件action
    */
    public class UploadAction extends Action {
        public ActionForward execute(
                ActionMapping mapping,
                ActionForm form,
                HttpServletRequest request,
                HttpServletResponse response) {
            //可以随便转载,请保留出自http://www.javaresearch.org 作者anEngineer
            DynaActionForm fileForm = (DynaActionForm) form;
            String[] types = (String[]) fileForm.get("type";
            String[] names = (String[]) fileForm.get("name";

            FormFile file0 = (FormFile) fileForm.get("file0";
            FormFile file1 = (FormFile) fileForm.get("file1";
            FormFile file2 = (FormFile) fileForm.get("file2";
            FormFile file3 = (FormFile) fileForm.get("file3";
            FormFile file4 = (FormFile) fileForm.get("file4";
            FormFile file5 = (FormFile) fileForm.get("file5";
            FormFile file6 = (FormFile) fileForm.get("file6";
            FormFile file7 = (FormFile) fileForm.get("file7";
            FormFile file8 = (FormFile) fileForm.get("file8");
            FormFile file9 = (FormFile) fileForm.get("file9");

            Map<String, FormFile> fileMap = new HashMap<String, FormFile>();
            fileMap.put("file0" + "*" + types[0] + "*" + names[0], file0);
            fileMap.put("file1" + "*" + types[1] + "*" + names[1], file1);
            fileMap.put("file2" + "*" + types[2] + "*" + names[2], file2);
            fileMap.put("file3" + "*" + types[3] + "*" + names[3], file3);
            fileMap.put("file4" + "*" + types[4] + "*" + names[4], file4);
            fileMap.put("file5" + "*" + types[5] + "*" + names[5], file5);
            fileMap.put("file6" + "*" + types[6] + "*" + names[6], file6);
            fileMap.put("file7" + "*" + types[7] + "*" + names[7], file7);
            fileMap.put("file8" + "*" + types[8] + "*" + names[8], file8);
            fileMap.put("file9" + "*" + types[9] + "*" + names[9], file9);

            Set fileSet = fileMap.entrySet();
            Iterator iter = fileSet.iterator();

            // 取当前系统路径E:\Tomcat5\webapps\strutsUpload\ 其中strutsUpload为当前context
            String filePath = this.getServlet().getServletContext().getRealPath("/");
            // 保存文件的文件夹
            File savePath = new File(filePath + "UploadFiles\\");
            filePath = filePath+ "UploadFiles\\";
            if (!savePath.exists()) {
                savePath.mkdir();
            }
            while (iter.hasNext()) {
                Map.Entry unit = (Map.Entry) iter.next();
                String key = (String) unit.getKey();
                FormFile file = (FormFile) unit.getValue();   
                //文件大小符合要求,且是图片文件
                if ((file.getFileSize() >= 1)&& DealPhoto.isPhoto(file)) {
                    //图片类别
                    String photoType = key.substring(key.indexOf("*") + 1, key
                            .lastIndexOf("*"));
                    //图片描述
                    String photoName = key.substring(key.lastIndexOf("*") + 1, key
                            .length());
                   
                    //存数据库操作,在数据库中保存文件的名称,类型,及在服务器上的相对路径
                    //
                   
                    //判断是否重名
                    if(DealPhoto.isFileExist(file.getFileName(),filePath))
                        DealPhoto.rename(file.getFileName(),filePath);
                    try {
                     InputStream stream = file.getInputStream();// 把文件读入
                     // 建立一个上传文件的输出流
                     OutputStream bos = new FileOutputStream(filePath+file.getFileName());
                     int bytesRead = 0;
                     byte[] buffer = new byte[8192];
                     while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
                      bos.write(buffer, 0, bytesRead);// 将文件写入服务器
                     }
                     bos.close();
                     stream.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            return mapping.findForward("uploaded");
            //还有其他可以改正的地方,如错误信息提示,把照片处理函数放到一个公用类,写文件操作等
            //可以随便转载,请保留出自http://www.javaresearch.org 作者anEngineer
        }
    }


    __________________
    只看该作者    顶部
    离线 马甲走江湖
    江湖任我行


    精华贴数 4
    个人空间 70
    技术积分 19717 (64)
    社区积分 26287 (62)
    注册日期 2006-10-26
    论坛徽章:167
    管理团队成员金牌徽章银牌徽章铜牌徽章2008欧洲杯之星欧洲冠军杯纪念徽章
    蓝色妖姬紫蜘蛛九尾狐狸玉石琵琶玉兔嫦娥

    发表于 2006-11-9 07:54 
    六。照片处理类文件
    package com.fangchuang.run;
    /**
    * 图片处理
    * @author anEngineer
    *
    */
    public class DealPhoto {
        /**
         * 判断照片类型 .jpg .png .gif 目前只支持这三种格式
         * @param file
         * @return
         */
        public static boolean isPhoto(FormFile file) {
            String fileName = getString(file.getFileName());
            if (fileName.equals("")
                return false;
            if ((fileName.toLowerCase().endsWith(".jpg")
                    || (fileName.toLowerCase().endsWith(".gif")
                    || (fileName.toLowerCase().endsWith(".png"))
                return true;
            else
                return false;
        }

        /**
         *
         * @param str
         * @return
         */
        public static String getString(String str) {
            if (str == null)
                str = "";
            if (str.equals("null")
                str = "";
            str = str.trim();
            return str;
        }

        /**
         * 判断文件是否存在
         * @param fileName
         * @param dir
         * @return
         */
        public static boolean isFileExist(String fileName, String dir) {
            File files = new File(dir + fileName);
            return (files.exists()) ? true : false;
        }

        /**
         * 重命名
         * @param fileName
         * @param dir
         */
        public static void rename(String fileName, String dir) {
            String extendFile = "";
            if (isJpg(fileName))
                extendFile = ".jpg";
            else if (isGif(fileName))
                extendFile = ".gif";
            else if (isPng(fileName))
                extendFile = ".png";
            else
                extendFile = ".jpg";
            Random random = new Random();
            int add = random.nextInt(10000);
            String ret = fileName + add + extendFile;
            while (isFileExist(ret, dir)) {
                add = random.nextInt(10000);
                ret = fileName + add + extendFile;
            }
            File file = new File(dir + fileName);
            File reFile = new File(dir + ret);
            file.renameTo(reFile);
        }

        public static boolean isGif(String file) {
            if (file.toLowerCase().endsWith(".gif") {
                return true;
            } else {
                return false;
            }
        }

        public static boolean isJpg(String file) {
            if (file.toLowerCase().endsWith(".jpg") {
                return true;
            } else {
                return false;
            }
        }

        public static boolean isPng(String file) {
            if (file.toLowerCase().endsWith(".png") {
                return true;
            } else {
                return false;
            }
        }
    }

        还有许多可以完善的地方,以后再补充!


    __________________
    只看该作者    顶部
    离线 woodelf_78
    版主


    精华贴数 10
    个人空间 0
    技术积分 7779 (215)
    社区积分 1110 (1141)
    注册日期 2004-7-29
    论坛徽章:31
    管理团队成员ITPUB元老NBA之星NBA常规赛纪念章itpub2007年荐股参与纪念徽章NBA季后赛之星
    NBA常规赛纪念章第18届世界杯(德国)纪念徽章体育版块博采纪念徽章2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:跆拳道2008北京奥运纪念徽章:垒球

    发表于 2006-11-9 08:20 
    看过


    __________________
    善良,好学,谦虚,自勉
    只看该作者    顶部
    离线 zhour560
    超级斑竹


    精华贴数 0
    个人空间 0
    技术积分 1946 (1043)
    社区积分 72 (5048)
    注册日期 2005-9-23
    论坛徽章:8
    授权会员     
          

    发表于 2006-11-9 16:48 
    顶,找个时间看看!


    __________________
    锐不可挡惊天地,气宇不凡乃周郎!MSN:zhour560@yahoo.com.cn,Email:zhour560@yahoo.com.cn
    只看该作者    顶部
    离线 elathen
    生于忧患,死于安乐


    精华贴数 1
    个人空间 0
    技术积分 5073 (335)
    社区积分 3030 (589)
    注册日期 2004-10-26
    论坛徽章:50
    现任管理团队成员ITPUB元老会员2007贡献徽章参与WIN7挑战赛纪念八级虎吧徽章授权会员
    2010年世界杯参赛球队:瑞士2010新春纪念徽章2010新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:鼠ITPUB8周年纪念徽章

    发表于 2006-11-10 13:12 
    继续努力


    __________________
    三十而立,新的责任,新的目标,新的开始!
    只看该作者    顶部
    离线 elathen
    生于忧患,死于安乐


    精华贴数 1
    个人空间 0
    技术积分 5073 (335)
    社区积分 3030 (589)
    注册日期 2004-10-26
    论坛徽章:50
    现任管理团队成员ITPUB元老会员2007贡献徽章参与WIN7挑战赛纪念八级虎吧徽章授权会员
    2010年世界杯参赛球队:瑞士2010新春纪念徽章2010新春纪念徽章生肖徽章2007版:兔生肖徽章2007版:鼠ITPUB8周年纪念徽章

    发表于 2006-11-10 13:13 
    几年前做过


    __________________
    三十而立,新的责任,新的目标,新的开始!
    只看该作者    顶部
    离线 matrixfg
    初级会员



    精华贴数 0
    个人空间 0
    技术积分 73 (24530)
    社区积分 0 (1050879)
    注册日期 2006-7-15
    论坛徽章:0
          
          

    发表于 2007-11-24 21:49 
    不错啊


    只看该作者    顶部
    离线 wujun_666666
    初级会员



    精华贴数 0
    个人空间 0
    技术积分 19 (66602)
    社区积分 0 (1384056)
    注册日期 2007-4-15
    论坛徽章:0
          
          

    发表于 2007-12-1 09:19 
    支持!!


    只看该作者    顶部
    相关内容


    CopyRight 1999-2006 itpub.net All Right Reserved.
    北京皓辰网域网络信息技术有限公司. 版权所有
    E-mail:Webmaster@itpub.net
    网站律师 隐私政策 知识产权声明
    京ICP证:060528号 联系我们