一:文件当个上传例子

     jsp页面代码:

       

 
  
  1. <form action="upload!oo" method="post"  enctype="multipart/form-data"> 
  2.         <s:fielderror></s:fielderror> 
  3.         选择图片:<input type="file" name="upload"/><br/> 
  4.         <input type="submit" value="上传"/> 
  5.     </form> 

   Action代码:注意:jsp页面input传入过来的name值一定要对应action里面设置的三个属性值,设置上传的类型和上传文件名都必须以name值开头...

     

 
  
  1. //封装上传文件域的属性 
  2.     private File upload; 
  3.      
  4.     //封装上传文件  类型  的属性 
  5.     private String uploadContentType; 
  6.     //封装上传文件  名   的属性 
  7.     private String uploadFileName; 

     action里面的方法...

      

 
  
  1. public String oo() throws Exception{ 
  2.         //设置上传服务器的位置 
  3.         String root=ServletActionContext.getServletContext().getRealPath("/")+"p_w_picpath/"; 
  4.         //设置输入流对象 
  5.         InputStream is=new FileInputStream(upload); 
  6.         //设置一个file对象 
  7.         File file=new File(root,uploadFileName);         
  8.         //设置一个输出流对象 
  9.         OutputStream os=new FileOutputStream(file); 
  10.         byte[] buff = new byte[1024]; 
  11.         int length = 0
  12.         while (-1 != (length = is.read(buff))) { 
  13.             os.write(buff, 0, length); 
  14.         } 
  15.         return SUCCESS; 
  16.     } 

然后看看struts.xml里面的配置

 

 
  
  1. <!-- 设置上传文件,使用拦截器 --> 
  2.         <interceptors> 
  3.             <interceptor name="myFileUpload" 
  4.                 class="org.apache.struts2.interceptor.FileUploadInterceptor"> 
  5.                 <!-- 设置上传文件的最大值 --> 
  6.                 <param name="maximumSize">9999999</param> 
  7.                 <!-- 设置允许上传的格式 --> 
  8.                 <param name="allowedTypes">p_w_picpath/png,p_w_picpath/gif,p_w_picpath/jpeg</param> 
  9.             </interceptor> 
  10.         </interceptors> 
  11.  
  12.         <!-- 实现单个上传... --> 
  13.         <action name="upload" class="com.cxm.Action.upload"> 
  14.             <!-- 引用拦截器 --> 
  15.             <interceptor-ref name="myFileUpload"></interceptor-ref> 
  16.             <interceptor-ref name="defaultStack"></interceptor-ref> 
  17.             <result name="success">/success.jsp</result> 
  18.             <result name="input">/index.jsp</result> 
  19.         </action> 

还有一个国际化的问题,,,代码如下

 

 
  
  1. <!-- 引用国际化 --> 
  2.     <constant name="struts.custom.i18n.resources" value="fileUpload"></constant> 
  3.  
  4.  
  5. 国际化资源文件代码如下 

 

行了 ,,这样子 ,struts2的单个上传文件就OK啦。。代码简单撒...

 

 

好了,其实文件多上传下载给这个也是差不多的,只是在action里面接收的都弄成集合就行了,代码如下...

 

 
  
  1. private List<File> uploads; 
  2.     private List<String> uploadsFileName; 
  3.     private List<String> uploadsContentType; 
  4.  
  5. action的方法如下 
  6. public String oo(){ 
  7.  
  8.         //设置上传服务器的位置 
  9.         String root=ServletActionContext.getServletContext().getRealPath("/")+"p_w_picpath/"; 
  10.          
  11.         for(int i=0;i<uploads.size();i++){ 
  12.             // 设置输入流对象 
  13.             InputStream is = null
  14.             try { 
  15.                 is = new FileInputStream(uploads.get(i)); 
  16.             } catch (FileNotFoundException e) { 
  17.                 e.printStackTrace(); 
  18.             } 
  19.             //设置一个file对象 
  20.             File file=new File(root,uploadsFileName.get(i)); 
  21.             //设置一个输出流对象 
  22.             OutputStream os = null
  23.             try { 
  24.                 os = new FileOutputStream(file); 
  25.             } catch (FileNotFoundException e) { 
  26.                 e.printStackTrace(); 
  27.             } 
  28.             byte[] buff = new byte[1024]; 
  29.             int length = 0
  30.             try { 
  31.                 while (-1 != (length = is.read(buff))) { 
  32.                     os.write(buff, 0, length); 
  33.                 } 
  34.             } catch (IOException e) { 
  35.                 e.printStackTrace(); 
  36.             } 
  37.         } 
  38.         return SUCCESS; 
  39.     } 

这样多上传就行了,特别注意的是,我在jsp里面弄了一个javascript的代码,javascript手动生成input表单,说白了就是想上传几个文件就点几下,我规定了最多可以同时上传五个..代码可以给大家看看,代码如下:

 

 
  
  1. <script language="javascript">    
  2.                  var count0 ;    
  3.                 var maxfile = 5
  4.                  增加元素 
  5.                 function addUpload() {   
  6.                     if(count >= maxfile)    return;//限制最多maxfile个文件框 
  7.                     count++;  
  8.                     //自增id不同的HTML对象,并附加到容器最后 
  9.                     var newDiv =  "<div id=divUpload" + count +">
  10.                         + " 选择图片:<input id=file" + count + " type=file size=50 name=uploads>
  11.                         + " <a href=javascript:delUpload('divUpload" + count + "');>删除</a>
  12.                         + " </div>";    
  13.                       document.getElementById("uploadContent").insertAdjacentHTML("beforeEnd", newDiv);      
  14.                 }    
  15.                 //删除指定元素 
  16.                 function delUpload(diva) {   
  17.                     count--;  
  18.                     document.getElementById(diva).parentNode.removeChild(document.getElementById(diva));    
  19.                 }    
  20.           </script> 
  21.     </head> 
  22.  
  23.     <body> 
  24.         <s:fielderror></s:fielderror> 
  25.         <form action="upload1!oo" method="post" enctype="multipart/form-data"> 
  26.             <div id="uploadContent"> 
  27.                 <a href="addUpload()"< /span>>添加附件</a> 
  28.             </div> 
  29.             <input type="submit" value="多上传" /> 
  30.         </form> 
  31.     </body> 

这样子的多上传就可以了。。。其实struts2已经对这个上传下载进行了封装,对我们来说已经是比较简单的了...

 

sturts2的下载:

首先先把图片展示出来...

 

 
  
  1. <c:forEach var="fileName" items="${uploadsFileName}"> 
  2.             <img alt="${fileName}" height="300px" width="150px" src="p_w_picpath/${fileName}"> 
  3.             <a href="downLoad?fileName=${fileName}">下载图片</a> 
  4.     </c:forEach> 

然后我们再看看struts.xml里面的配置

 

 
  
  1. <!-- 实现文件下载........ --> 
  2.         <action name="downLoad" class="com.cxm.Action.downLoad"> 
  3.             <param name="inputPath">/p_w_picpath/${fileName}</param> 
  4.             <result name="success" type="stream"> 
  5.                 <!-- 指定文件的下载格式 --> 
  6.                 <param name="contentType">p_w_picpath/jpeg</param> 
  7.                 <!--p_w_upload加上下载的时候有保存框,filename文件名,contentDisposition内容地理位置  --> 
  8.                 <!-- 指定下载的文件名 --> 
  9.                 <param name="contentDisposition">p_w_upload;filename=${fileName}</param> 
  10.                 <!-- 指定被下载的文件的文件名....给方法名一样,少get --> 
  11.                 <param name="inputName">downloadFile</param> 
  12.                 <!-- 指定下载文件时的缓冲大小 --> 
  13.                 <param name="bufferSize">4096</param> 
  14.             </result> 
  15.         </action> 

再看看action里面的方法。。。

 

 
  
  1. public InputStream getDownloadFile() throws Exception { 
  2.         System.out.println(fileName+"========"+"p_w_picpath/"+this.getFileName()); 
  3.         InputStream isServletActionContext.getServletContext().getResourceAsStream("p_w_picpath/"+this.getFileName()); 
  4.         System.out.println(is+"=====================>"); 
  5.              
  6.         return is; 
  7.     } 
  8.     public String execute() { 
  9.         return SUCCESS; 
  10.     } 

getDownloadFile方法的目的是为了等到一个文件流,给struts2.xml里面的配置inputName的值是相关联的,去掉get,然后首字母小写,这样就差不多啦..千万要记住,在连接下载的时候千万不要指向这个方法,不然会包io转String的错...大家一定要记住了..