天天看点

struts 文件上传(主框架、子框架传值等问题)

 Struts 文件上传(模块)总结

-、功能要求:

1.基本文件上传

2.jsp页面参数指定文件上传到服务器的路径

3.jsp页面参数限制上传文件类型

4.在服务器端保存文件到文件夹,保存文件路径到数据库

二、开发环境

  • 开发语言 -- jdk1.5
  • web应用服务器 -- tomcat5.5
  • IDE工具 -- eclipse3.2+myeclipse5.1+Subclipse
  • 代码、文档管理工具 -- Svn1.4
  • 数据库 -- Oracle9i

三、系统架构

struts 文件上传(主框架、子框架传值等问题)

<1> Web层采用struts

<2> Service层采用spring

<3> 持久层采用hibernate

四、上传模块的实现(struts层)---相对独立。

使用组件:Struts Upload

主页面 子页面
Jsp b.jsp a.jsp
Action productActionàproductDAOàproduct UploadAction/UploadForm
表单

产品编号

名称

生产厂家

上传文件路径(hidden)

指定文件路径

被限制文件类型

上传的文件

调用方式 外部菜单 <iframe src=””></iframe>
执行按钮 提交、重置、返回 上传

工作逻辑:

点击相关菜单后,跳转到“产品添加”主页面。在主页面中设置“允许上传文件的类型”和“上传到服务器的路径”,并在<iframe src=””>的路径中作为参数传给子页面(负责上传文件)。在主页面中上传子框架内点击“浏览”按钮,选择需上传的文件,然后点击“上传”按钮进行上传,在UploadAction中进行上传处理,取得文件上传到服务器的路径后,通过

struts 文件上传(主框架、子框架传值等问题)

request.setAttribute( " filePath " , filePath  +  fileName);

将文件在服务器上的路径传回 a.jsp页面(子页面),在a.jsp页面中通过

struts 文件上传(主框架、子框架传值等问题)

parent.document.all.filePath.value  =   " ${filePath} " ;

将在a.jsp子页面中取得的由UploadAction传回的文件路径再传给b.jsp主页面. 这时主页面已经得到了子页面传回的“上传文件在服务器上的路径”。将添加表单的其他项(如产品编号、名称、生产厂家等)填写完整后(这一步可以先于文件上传来做),点击“提交”按钮,提交整个表单(包括了 文件路径 在页面中是以隐式标签来做),将表单信息添加到数据库。

页面示例图:

struts 文件上传(主框架、子框架传值等问题)

出现问题与解决:

<1>如何从主框架向子框架传递参数(允许上传文件的类型,上传到服务器的路径  在主页面中指定)

struts 文件上传(主框架、子框架传值等问题)

// b.jsp

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

<%

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

    String sub_path  =   " incoming/zygl/equipment " ; 

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

    String up_file_type  =   " txt,rar,zip,doc " ;

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

%>  

struts 文件上传(主框架、子框架传值等问题)

// b.jsp <form  action="<%=request.getContextPath()%>/productAction.do"         method="post" name="ClientForm">

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

< tr >< td class = " td " >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        <html:hidden name="hidd" styleClass="shuru" property="filePath" value="" />  

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        < html:errors property = " filePath " />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

     </ td >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ tr > </form>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

// b.jsp

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

< tr >< td class = " td " >< span class = " font13b " > 产品说明书: </ span >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

     < iframe 

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

      src=" ../../../../commons/a.jsp?subPath=<%=sub_path%>&upFileType=<%=up_file_type%>" 

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

      name = " display "  width = " 300 "  height = " 25 "  

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

      marginwidth = " 0 "  marginheight = " 0 "  scrolling = " no "  frameborder = " 0 " >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

   </ iframe >   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ td >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ tr >

struts 文件上传(主框架、子框架传值等问题)

<2>如何从子框架向主框架传第参数

struts 文件上传(主框架、子框架传值等问题)

// a.jsp

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

< script type = " text/javascript " >  

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        function  pathPush() ... {

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        //子框架向主框架传值

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              if("${filePath}" != "null" && "${filePath}" != "")...{

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                     parent.document.all.filePath.value = "${filePath}";

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              }

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        // 一些异常情况提示

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              if("${errMessage}" != "")...{

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                    alert("${errMessage}");

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              }

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

}

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ script >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

// a.jsp

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

< body onLoad = " pathPush(); " >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        <%

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              String path  =  (String) request.getAttribute( " filePath " ); 

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        %>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        <%

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

               if  (path  !=   null )  ... {

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

       %>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              上传成功!

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

       <%

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              }   else   ... {

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

       %>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              <html:form action="uploadsAction.do" enctype="multipart/form-data">

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                  <html:hidden property="subPath" value="<%=request.getParameter("subPath")%>" />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                  <html:hidden property="upFileType" value="<%=request.getParameter("upFileType")%>" />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                  <html:file property="theFile" />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                  <html:submit value="上传" />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              </html:form>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

       <%

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

              }

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        %>

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ body >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

// b.jsp

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

< tr >< td class = " td " >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        < html:hidden name = " hidd "  styleClass = " shuru "  property = " filePath "  value = ""   />  

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        < html:errors property = " filePath " />

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

     </ td >

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

</ tr >

struts 文件上传(主框架、子框架传值等问题)

<3>路径乱码问题

   描述:在a.jsp中取得的filePath值为乱码,且路径分隔符“/”也不见了。传到数据库中的文件路径也是乱码。

如:E:Apache Software FoundationTomcat 5.5/webapps/mmxtincoming/20010331115151_新建 文本文档.txt 

     变为

E:Apache Software FoundationTomcat 5.5webappsmmxtincoming?10331115151_怴寶 暥杮暥瀮.txt

   问题原因:路径分隔符“/”,在传递过程中被屏蔽。

   解决办法:增加一个字符串替换函数,将“/”替换为“//”则在传递过程中就无误了。

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

public     static    String   replace(String   strSource,   String   strFrom,   String   strTo)    ... {           

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        if   (strSource   ==   null)   ...{                   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            return   null;           

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        }       

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        int   i   =   0;   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        if   ((i   =   strSource.indexOf(strFrom,   i))   >=   0)   ...{   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            char[]   cSrc   =   strSource.toCharArray();   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            char[]   cTo   =   strTo.toCharArray();   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            int   len   =   strFrom.length();       

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            StringBuffer   buf   =   new   StringBuffer(cSrc.length);       

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            buf.append(cSrc,   0,   i).append(cTo);   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            i   +=   len;           

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            int   j   =   i;                 

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            while   ((i   =   strSource.indexOf(strFrom,   i))   >   0)   ...{       

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                buf.append(cSrc,   j,   i   -   j).append(cTo);         

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                i   +=   len;       

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

                j   =   i;                   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            }                   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            buf.append(cSrc,   j,   cSrc.length   -   j);     

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

            return   buf.toString();     

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        }     

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

        return   strSource;   

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

    }

struts 文件上传(主框架、子框架传值等问题)

 相应部位改为:filePath = replace(filePath,"//", "//"+"//");

//UploadAction.java

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

    //取得上传的文件

struts 文件上传(主框架、子框架传值等问题)

    UpLoadForm theForm = (UpLoadForm) form;

struts 文件上传(主框架、子框架传值等问题)

    FormFile file = theForm.getTheFile();

       //如果上传文件为空

   if(fileName.equals("")){

    request.setAttribute("errMessage", "请选择要上传的文件");

    return mapping.findForward("display");

   }

   //文件类型限制

   if(!isValidFile(fileName,theForm.getUpFileType())){  

      System.out.println("不允许上传该类型文件");

      request.setAttribute("errMessage", "不允许上传该类型文件");

               return mapping.findForward("display");  

         }

   //文件大小限制

   if(file.getFileSize() > (10*1024*1024)){

    request.setAttribute("errMessage", "文件大小最大为10M");

    return mapping.findForward("display"); 

   }

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

      ……    …  中略 …    ……

struts 文件上传(主框架、子框架传值等问题)
struts 文件上传(主框架、子框架传值等问题)

    //取文件保存到服务器的路径

struts 文件上传(主框架、子框架传值等问题)

    String filePath = request.getRealPath("/") + theForm.getSubPath() + "//";

struts 文件上传(主框架、子框架传值等问题)

    filePath = replace(filePath,"//", "//"+"//");

   //上传文件类型设定

 private boolean isValidFile(String fileName, String upFileType) {  

        String[] validFiles;  

        validFiles = upFileType.split(",");

        boolean ret = false;  

        for (int i = 0; i < validFiles.length; i++) {  

            if (fileName.toLowerCase().endsWith(validFiles[i])) {  

                ret = true;  

                break;  

            }  

        }  

        return ret;  

    }

五、部分源文件下载(部分文件名与例子有出入)

  http://fileblog.hjbbs.com/upload/200804/20080401100006614_817_2213.rar

     相关论坛帖子参考:

     http://topic.csdn.net/u/20080331/12/d660792e-1a05-41c9-89e9-272d5d152a2b.html

     http://topic.csdn.net/u/20080331/12/d660792e-1a05-41c9-89e9-272d5d152a2b.html