ajaxFileUpload+struts2实现多文件上传

以前有介绍过ajaxFileUpload实现文件上传,但那是单文件的,这次介绍多文件上传。

单文件上传参考:http://blog.csdn.net/itmyhome1990/article/details/23187087

单文件和多文件的实现区别主要修改两点,

一是插件ajaxfileupload.js里接收file文件ID的方式

二是后台action是数组形式接收

1、ajaxFileUpload文件下载地址http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

2、引入jQuery-1.8.0.min.js、ajaxFileUpload.js文件

3、文件上传页面核心代码

[html]  view plain  copy
  1. <body>  
  2.     <form action="" enctype="multipart/form-data">  
  3.         <h2>  
  4.             多文件上传  
  5.         </h2>  
  6.         <input type="file" id="file1" name="file" />  
  7.         </br>  
  8.         <input type="file" id="file2" name="file" />  
  9.         </br>  
  10.         <input type="file" id="file3" name="file" />  
  11.         </br>  
  12.         <span>  
  13.             <table id="down">  
  14.             </table>  
  15.         </span>  
  16.         </br>  
  17.         <input type="button" onclick="fileUpload();" value="上传">  
  18.     </form>  
  19. </body>  
  20. <script type="text/javascript">  
  21.     function fileUpload() {  
  22.         var files = ['file1','file2','file3'];  //将上传三个文件 ID 分别为file2,file2,file3  
  23.         $.ajaxFileUpload( {  
  24.             url : 'fileUploadAction',     //用于文件上传的服务器端请求地址    
  25.             secureuri : false,            //一般设置为false    
  26.             fileElementId : files,        //文件上传的id属性  <input type="file" id="file" name="file" />    
  27.             dataType : 'json',            //返回值类型 一般设置为json    
  28.             success : function(data, status) {  
  29.                 var fileNames = data.fileFileName; //返回的文件名   
  30.                 var filePaths = data.filePath;     //返回的文件地址   
  31.                 for(var i=0;i<data.fileFileName.length;i++){  
  32.                     //将上传后的文件 添加到页面中 以进行下载  
  33.                     $("#down").after("<tr><td height='25'>"+fileNames[i]+  
  34.                             "</td><td><a href='downloadFile?downloadFilePath="+filePaths[i]+"'>下载</a></td></tr>")  
  35.                 }  
  36.             }  
  37.         })  
  38.     }  
  39. </script>  
以上fileElementId属性接收的files参数为['file1','file2','file3']

由于是多文件,所以我们需要修改ajaxfileupload.js 找到以下代码

[javascript]  view plain  copy
  1. var oldElement = jQuery('#' + fileElementId);  
  2. var newElement = jQuery(oldElement).clone();  
  3. jQuery(oldElement).attr('id', fileId);  
  4. jQuery(oldElement).before(newElement);  
  5. jQuery(oldElement).appendTo(form);  
修改为:

[javascript]  view plain  copy
  1. for(var i in fileElementId){    
  2.     var oldElement = jQuery('#' + fileElementId[i]);    
  3.     var newElement = jQuery(oldElement).clone();    
  4.     jQuery(oldElement).attr('id', fileId);    
  5.     jQuery(oldElement).before(newElement);    
  6.     jQuery(oldElement).appendTo(form);    
  7. }   

4、文件上传Action

[java]  view plain  copy
  1. public class FileAction {  
  2.     private File[] file;              //文件    
  3.     private String[] fileFileName;    //文件名     
  4.     private String[] filePath;        //文件路径  
  5.     private String downloadFilePath;  //文件下载路径  
  6.     private InputStream inputStream;   
  7.       
  8.     /** 
  9.      * 文件上传 
  10.      * @return 
  11.      */  
  12.     public String fileUpload() {  
  13.         String path = ServletActionContext.getServletContext().getRealPath("/upload");  
  14.         File file = new File(path); // 判断文件夹是否存在,如果不存在则创建文件夹  
  15.         if (!file.exists()) {  
  16.             file.mkdir();  
  17.         }  
  18.         try {  
  19.             if (this.file != null) {  
  20.                 File f[] = this.getFile();  
  21.                 filePath = new String[f.length];  
  22.                 for (int i = 0; i < f.length; i++) {  
  23.                     String fileName = java.util.UUID.randomUUID().toString(); // 采用时间+UUID的方式随即命名  
  24.                     String name = fileName + fileFileName[i].substring(fileFileName[i].lastIndexOf(".")); //保存在硬盘中的文件名  
  25.   
  26.                     FileInputStream inputStream = new FileInputStream(f[i]);  
  27.                     FileOutputStream outputStream = new FileOutputStream(path+ "\\" + name);  
  28.                     byte[] buf = new byte[1024];  
  29.                     int length = 0;  
  30.                     while ((length = inputStream.read(buf)) != -1) {  
  31.                         outputStream.write(buf, 0, length);  
  32.                     }  
  33.                     inputStream.close();  
  34.                     outputStream.flush();  
  35.                     //文件保存的完整路径  
  36.                     // 如:D:\tomcat6\webapps\struts_ajaxfileupload\\upload\a0be14a1-f99e-4239-b54c-b37c3083134a.png  
  37.                     filePath[i] = path + "\\" + name;  
  38.                 }  
  39.   
  40.             }  
  41.         } catch (Exception e) {  
  42.             e.printStackTrace();  
  43.         }  
  44.         return "success";  
  45.     }  
  46.     /** 
  47.      * 文件下载 
  48.      * @return 
  49.      */  
  50.     public String downloadFile() {  
  51.         String path = downloadFilePath;  
  52.         HttpServletResponse response = ServletActionContext.getResponse();  
  53.         try {  
  54.             // path是指欲下载的文件的路径。  
  55.             File file = new File(path);  
  56.             // 取得文件名。  
  57.             String filename = file.getName();  
  58.             // 以流的形式下载文件。  
  59.             InputStream fis = new BufferedInputStream(new FileInputStream(path));  
  60.             byte[] buffer = new byte[fis.available()];  
  61.             fis.read(buffer);  
  62.             fis.close();  
  63.             // 清空response  
  64.             response.reset();  
  65.             // 设置response的Header  
  66.             String filenameString = new String(filename.getBytes("gbk"),"iso-8859-1");  
  67.             response.addHeader("Content-Disposition""attachment;filename="+ filenameString);  
  68.             response.addHeader("Content-Length""" + file.length());  
  69.             OutputStream toClient = new BufferedOutputStream(response.getOutputStream());  
  70.             response.setContentType("application/octet-stream");  
  71.             toClient.write(buffer);  
  72.             toClient.flush();  
  73.             toClient.close();  
  74.         } catch (IOException ex) {  
  75.             ex.printStackTrace();  
  76.         }  
  77.         return null;  
  78.     }  
  79.     /** 
  80.      * 省略set get方法 
  81.      */  
  82.       
  83. }  

5、struts配置

[html]  view plain  copy
  1. <!DOCTYPE struts PUBLIC   
  2.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  3.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  4. <struts>  
  5.     <package name="ajax_code" extends="json-default">  
  6.         <!-- 文件上传 -->  
  7.         <action name="fileUploadAction" class="com.itmyhome.FileAction" method="fileUpload">  
  8.             <result type="json" name="success">  
  9.                 <param name="contentType">text/html</param>  
  10.             </result>  
  11.         </action>  
  12.     </package>  
  13.     <package name="jsp_code" extends="struts-default">  
  14.         <!-- 文件下载 -->       
  15.         <action name="downloadFile" class="com.itmyhome.FileAction" method="downloadFile">     
  16.             <result type="stream">     
  17.                  <param name="contentType">application/octet-stream</param>      
  18.                  <param name="inputName">inputStream</param>      
  19.                  <param name="contentDisposition">attachment;filename=${fileName}</param>      
  20.                  <param name="bufferSize">4096</param>     
  21.             </result>     
  22.        </action>    
  23.     </package>  
  24. </struts>  

浏览器中输入:http://localhost:8080/struts_ajaxfileupload/index.jsp  即可进行文件上传

如图:


项目源码下载:http://download.csdn.net/detail/itmyhome/7584519



转载请注明出处:http://blog.csdn.net/itmyhome1990/article/details/36396291

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值