利用struts2进行单个文件,批量文件上传,ajax异步上传以及下载
1.页面显示代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE > <html> <head> <script type="text/javascript" src="<%=path%>/jsAndCss/jquery-1.11.0.js" ></script> <script type="text/javascript" src="<%=path%>/jsAndCss/util.js" ></script> <script type="text/javascript" src="<%=path%>/jsAndCss/ajaxfileupload.js" ></script> </head> <body> <h1>文件表单上传</h1> <form method = "post" action = "upload.action" enctype=multipart/form-data> 文件 : <input type ="file" name = "myFile"> <input type = "submit" value = "上传"> </form> <br><br> <h1>文件表单下载</h1> <form method = "post" action = "download.action" enctype=multipart/form-data> <input type = "submit" value = "下载"> </form> <br><br> <h1>文件ajax上传</h1> <form> 文件 : <input type ="file" name = "myFileAjax" id = "myFileAjax"> <input type = "button" value = "ajax上传" onclick = "updownMgr.upload();"> </form> <br><br> <h1>批量文件的上传</h1> <form method = "post" action = "uploadBatch.action" enctype=multipart/form-data> <!--文件 1: <input type ="file" name = "myFile"><br><br> 文件 2: <input type ="file" name = "myFile"><br><br> 文件 3: <input type ="file" name = "myFile"><br><br> 文件 4: <input type ="file" name = "myFile"> --> <!--一次按住ctrl可提交多个文件 --> <input type="file" name="myFile" multiple="multiple"> <input type = "submit" value = "提交"><br><br> </form> <script type="text/javascript"> var updownMgr = { upload:function(){ //$.AjaxFileUpload这里不要写成大写的A $.ajaxFileUpload({ url:'uploadAjax.action',//用于文件上传的请求地址 fileElementId :'myFileAjax',//文件上传空间的id属性,通过这个id,相当于非异步中的myFile dataType:'text', success: function(data,status){ alert(data); }, error: function(data,status,e){ alert(e+"===上传文件失败"); } }); } }; </script> </body> </html>
二.代码
1.UploadAction.java代码
package org.scs.studystruts2.sysmanage.action; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class UploadAction { //跟表单提交的input type = file 的name 保持一致 private File myFile; //文件名称 (myFile+myFileFileName)固定格式 private String myFileFileName; //文件类型 myFile+"ContentType"固定格式 private String myFileContentType; //这是我们在action配置里面的参数allowTypes private String allowTypes; private String message; public File getMyFile() { return myFile; } public void setMyFile(File myFile) { this.myFile = myFile; } public String getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String myFileFileName) { this.myFileFileName = myFileFileName; } public String getMyFileContentType() { return myFileContentType; } public void setMyFileContentType(String myFileContentType) { this.myFileContentType = myFileContentType; } public String getAllowTypes() { return allowTypes; } public void setAllowTypes(String allowTypes) { this.allowTypes = allowTypes; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } //默认执行的方法 gotoLogin.action public String execute(){ return "success"; } public String upload () throws Exception{ //判断文件类型,如果使我们系统允许的文件类型,就进入上传流程,否则给出错误提示 //在action配置了allowTypes参数来定义我们允许的上传类型 boolean allowedFlag = false; String[] allowTypeArray = allowTypes.split(","); for(String fileTypes :allowTypeArray){ if(fileTypes.equals(myFileContentType)){ allowedFlag = true; } } if (allowedFlag) { String uploadRootPath = "D://yu//lou//chun"; File file = new File(uploadRootPath); if (!file.exists()) { file.mkdirs(); } //第二步:我们是不是将我们的文件放入到inputStream里面去了,然后用outputstream写入到文件中 InputStream is = null; OutputStream os = null; try { is =new BufferedInputStream(new FileInputStream(myFile)); os = new BufferedOutputStream(new FileOutputStream(uploadRootPath+"//"+myFileFileName)); byte[] buffer = new byte[1024]; int len =0; while((len = is.read(buffer)) !=-1){ os.write(buffer, 0, len); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if (os!=null) { os.flush(); os.close(); } if (is!=null) { is.close(); } } this.message = "文件上传成功"; return "success"; }else { this.message = "文件上传失败"; return "fail"; } } }
2.UploadBatch.java
和单个文件的差不多,只是把相应的改成数组,然后遍历一下
package org.scs.studystruts2.sysmanage.action; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; public class UploadBatchAction { //跟表单提交的input type = file 的name 保持一致 private File[] myFile; //文件名称 (myFile+myFileFileName)固定格式 private String[] myFileFileName; //文件类型 myFile+"ContentType"固定格式 private String[] myFileContentType; private String message; public File[] getMyFile() { return myFile; } public void setMyFile(File[] myFile) { this.myFile = myFile; } public String[] getMyFileFileName() { return myFileFileName; } public void setMyFileFileName(String[] myFileFileName) { this.myFileFileName = myFileFileName; } public String[] getMyFileContentType() { return myFileContentType; } public void setMyFileContentType(String[] myFileContentType) { this.myFileContentType = myFileContentType; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String uploadBatch () throws Exception{ for (int i = 0; i < myFile.length; i++) { //第一步设置文件保存的位置 String uploadRootPath = "D://yu//lou//chun"; File file = new File(uploadRootPath); if (!file.exists()) { file.mkdirs(); } //第二步:我们是不是将我们的文件放入到inputStream里面去了,然后用outputstream写入到文件中 InputStream is = null; OutputStream os = null; try { is =new BufferedInputStream(new FileInputStream(myFile[i])); os = new BufferedOutputStream(new FileOutputStream(uploadRootPath+"//"+myFileFileName[i])); byte[] buffer = new byte[1024]; int len =0; while((len = is.read(buffer)) !=-1){ os.write(buffer, 0, len); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { if (os!=null) { os.flush(); os.close(); } if (is!=null) { is.close(); } } } this.message = "文件上传成功"; return "success"; } }
3.UploadAjax.java
注意引入前端页面引入jquery-1.11.0.js , ajaxfileupload.js
<head>
<script type="text/javascript" src="<%=path%>/jsAndCss/jquery-1.11.0.js" ></script>
<script type="text/javascript" src="<%=path%>/jsAndCss/util.js" ></script>
<script type="text/javascript" src="<%=path%>/jsAndCss/ajaxfileupload.js" ></script>
</head>
1 package org.scs.studystruts2.sysmanage.action; 2 import java.io.BufferedInputStream; 3 import java.io.BufferedOutputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 7 import java.io.InputStream; 8 import java.io.OutputStream; 9 import java.io.PrintWriter; 10 11 import javax.servlet.http.HttpServletResponse; 12 13 import org.apache.struts2.ServletActionContext; 14 15 public class UploadAjaxAction { 16 //跟表单提交的input type = file 的name 保持一致 17 private File myFileAjax; 18 19 //文件名称 (myFile+myFileFileName)固定格式 20 private String myFileAjaxFileName; 21 22 //文件类型 myFile+"ContentType"固定格式 23 private String myFileAjaxContentType; 24 25 private String message; 26 27 28 public File getMyFileAjax() { 29 return myFileAjax; 30 } 31 32 public void setMyFileAjax(File myFileAjax) { 33 this.myFileAjax = myFileAjax; 34 } 35 36 public String getMyFileAjaxFileName() { 37 return myFileAjaxFileName; 38 } 39 40 public void setMyFileAjaxFileName(String myFileAjaxFileName) { 41 this.myFileAjaxFileName = myFileAjaxFileName; 42 } 43 44 public String getMyFileAjaxContentType() { 45 return myFileAjaxContentType; 46 } 47 48 public void setMyFileAjaxContentType(String myFileAjaxContentType) { 49 this.myFileAjaxContentType = myFileAjaxContentType; 50 } 51 52 public String getMessage() { 53 return message; 54 } 55 56 public void setMessage(String message) { 57 this.message = message; 58 } 59 60 public String uploadAjax() throws Exception{ 61 //第一步:首先我们需要确定上传过来的文件我们保存在哪里 62 String uploadRootPath = "D://yu//lou//chun"; 63 File file = new File(uploadRootPath); 64 if (!file.exists()) { 65 file.mkdirs(); 66 } 67 //第二步:我们是不是将我们的文件放入到inputStream里面去了,然后用outputstream写入到文件中 68 InputStream is = null; 69 OutputStream os = null; 70 try { 71 is =new BufferedInputStream(new FileInputStream(myFileAjax)); 72 os = new BufferedOutputStream(new FileOutputStream(uploadRootPath+"//"+myFileAjaxFileName)); 73 byte[] buffer = new byte[1024]; 74 int len =0; 75 while((len = is.read(buffer)) !=-1){ 76 os.write(buffer, 0, len); 77 } 78 } catch (Exception e) { 79 // TODO Auto-generated catch block 80 e.printStackTrace(); 81 }finally { 82 if (os!=null) { 83 os.flush(); 84 os.close(); 85 } 86 if (is!=null) { 87 is.close(); 88 } 89 } 90 this.message = "文件上传成功"; 91 HttpServletResponse response = ServletActionContext.getResponse(); 92 response.setCharacterEncoding("UTF-8"); 93 response.setContentType("text/html;charset=UTF-8"); 94 PrintWriter out = response.getWriter(); 95 out.print(message); 96 out.flush(); 97 out.close(); 98 return null; 99 100 } 101 }
4.Download.java
1 package org.scs.studystruts2.sysmanage.action; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.InputStream; 6 7 public class DownloadAction { 8 9 public InputStream getDownloadFile() throws FileNotFoundException{ 10 return new FileInputStream("D://yu//lou//chun//detail.jpg"); 11 } 12 public String download(){ 13 return "success"; 14 } 15 }
5.struts2.xml
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <package name="loginPackage" namespace="/" extends="struts-default"> 8 <action name="login" class="org.scs.studystruts2.sysmanage.action.LoginAction"> 9 <result name="success" type="dispatcher">/login_suc.jsp</result> 10 <result name="fail" type="dispatcher">/login_err.jsp</result> 11 </action> 12 13 <action name="gotoUpload" class="org.scs.studystruts2.sysmanage.action.UploadAction"> 14 <result name="success" type="dispatcher">/WEB-INF/pages/upload/upload.jsp</result> 15 </action> 16 17 <action name="upload" class="org.scs.studystruts2.sysmanage.action.UploadAction" method="upload"> 18 <result name="success" type="dispatcher">/WEB-INF/pages/upload/upload_suc.jsp</result> 19 <result name="fail" type="dispatcher">/WEB-INF/pages/upload/upload_err.jsp</result> 20 <!--传递的allowTypes参数 --> 21 <param name="allowTypes">image/jpeg,image/bmp,image/png,image/gif</param> 22 </action> 23 24 <action name="uploadAjax" class="org.scs.studystruts2.sysmanage.action.UploadAjaxAction" method="uploadAjax"> 25 26 </action> 27 28 <action name = "download" class = "org.scs.studystruts2.sysmanage.action.DownloadAction" method = "download"> 29 <result type="stream"> 30 <!--inline --> 31 <param name="contentDisposition">attachment;filename="321.jpg"</param> 32 <param name="inputName">downloadFile</param> 33 </result> 34 </action> 35 36 <action name="uploadBatch" class="org.scs.studystruts2.sysmanage.action.UploadBatchAction" method="uploadBatch"> 37 <result name="success" type="dispatcher">/WEB-INF/pages/upload/upload_suc.jsp</result> 38 <result name="fail" type="dispatcher">/WEB-INF/pages/upload/upload_err.jsp</result> 39 </action> 40 41 </package> 42 <!--如果有类似的报错信息则需要加上这段代码,创建临时文件 --> 43 <constant name="struts.multipart.saveDir" value="/tmp"/> 44 </struts>