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文件

  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">


   
        actionServlet
        org.apache.struts.action.ActionServlet
       
             config
             /WEB-INF/struts-config.xml
       

       
             debug
             2
       

        0
   

   
   
        actionServlet
        *.do
   

   
   
         index.jsp
   

   
   
         404
         /error.jsp
   



二。struts-config.xml文件

   
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://struts.apache.org/dtds/struts-config_1_2.dtd">

    
    
        
           
           
             
           
           
           
           
           
           
           
           
           
        

    

    
    
             
             
    

    
    
                            name="uploadForm" scope="request" input="/upload.jsp">
               
         

    



三。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文件









   
       
           
           
           
       

       
           

           

           
       


       
           

           

           
       
       
           

           

           
       
       
           

           

           
       
       
           

           

           
       
       
           

           

           
       
       
           

           

           
       
       
           

           

           
       
       
           

           

           
       


       
           

           

           
       

       
           
           
           
       

   
文件类型 文件描述 文件名

           

           

           

           

           

           

           

           

           

           
                onclick="return(confirm('你确认要上传文件吗?'))">






四。还有两个简单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 fileMap = new HashMap();
        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
    }
}

六。照片处理类文件
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;
        }
    }
}

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

你可能感兴趣的:(Struts,JSP,Web,Bean,XML)