参考了网上一些朋友的资料,自己写了一个struts2的上传例子:
工程使用的是struts2和spring3整合的的,整合部分的配置就不写了,我导入的包有:
struts2部分一共7个:spring3就省略了。
commons-fileupload-1.1.1.jar
commons-io-1.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.8.jar
ognl-2.6.11.jar
xwork-2.0.7.jar
struts2-core-2.0.14.jar
<body> <!-- jsp部分,body里面写了两个表单,一个是fileUpload.action的是struts2上传,fileUploadOther.action的是写IO操作 --> <!-- <form action="/struts2upload/system/upload/fileUpload.action" enctype="multipart/form-data" method="post"> 请选择文件:<input type="file" id="fileOp" name="fileOp" /><input type="submit" value="上传" /> </form> --> <br/><br/> <form action="/struts2upload/system/upload/fileUploadOther.action" enctype="multipart/form-data" method="post"> 请选择文件:<input type="file" id="fileOp" name="fileOp" /><input type="submit" value="上传" /> </form> </body>
<!-- spring的配置,把路径依赖注入到配置文件里面,IO操作那种方式用的savePath --> <bean id="myFileUploadAction" class="com.zyujie.action.UploadAction" scope="prototype"> <property name="savePath" value="D:\webapp\apache-tomcat-6.0.10\webapps\struts2upload\upfiles" /> </bean>
<struts> <!-- 该属性指定需要Struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由Struts2处理。 如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。 --> <constant name="struts.action.extension" value="action" /> <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 开发模式下使用,这样可以打印出更详细的错误信息 --> <constant name="struts.devMode" value="true" /> <!-- 默认的视图主题 --> <constant name="struts.ui.theme" value="simple" /> <!-- 集成spring,把struts给spring容器管理 --> <constant name="struts.objectFactory" value="spring" /> <!-- 解决乱码 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) --> <constant name="struts.multipart.maxSize" value="2097152"/> <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir --> <constant name="struts.multipart.saveDir" value="E:/test" /> <package name="syserror" extends="struts-default"> <global-results> <result name="sql">/system_error.jsp</result> <result name="invalidinput">/invalid_input.jsp</result> <result name="naming">/system_error.jsp</result> <result name="io">/system_error.jsp</result> <result name="nullpointer">/system_error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping result="sql" exception="java.sql.SQLException"></exception-mapping> <exception-mapping result="invalidinput" exception="cn.codeplus.exception.InvalidInputException"></exception-mapping> <exception-mapping result="naming" exception="javax.naming.NamingException"></exception-mapping> </global-exception-mappings> </package> <!-- Configuration for the default package. --> <package name="upload" namespace="/system/upload" extends="struts-default"> <action name="fileUpload" class="myFileUploadAction" method="fileUpload"> <!-- <param name="fileOpFileName">12345.gif</param> --> <result name="success" type="redirect">/ok.jsp</result> <result name="io" type="redirect">/system_error.jsp</result> <result name="nullpointer" type="redirect">/system_error.jsp</result> <exception-mapping result="io" exception="java.io.IOException"></exception-mapping> <exception-mapping result="nullpointer" exception="java.lang.NullPointerException"></exception-mapping> </action> <action name="fileUploadOther" class="myFileUploadAction" method="fileUploadOther"> <!-- 动态设置savePath的属性值,设置为服务器上的路径 --> <!-- <param name="savePath">D:\webapp\apache-tomcat-6.0.10\webapps\struts2upload\upfiles</param> --> <param name="fileOpFileName">abcde.xls</param> <result name="success" type="redirect">/ok.jsp</result> <result name="input" type="redirect">/index.jsp</result> <!-- 实现struts的默认拦截器功能,所以要在后面加一个defaultStack,默认拦截栈 --> <interceptor-ref name="fileUpload"> <!-- 文件过滤 <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/jpg</param>--> <!-- 文件大小, 以字节为单位 --> <param name="maximumSize">2097152</param> </interceptor-ref> <!-- 默认拦截器必须放在fileUpload之后,否则无效 --> <interceptor-ref name="defaultStack" /> </action> </package> </struts>
package com.zyujie.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; @SuppressWarnings("serial") public class UploadAction extends ActionSupport { // 上传的文件 private File fileOp; //文件名称 private String fileOpFileName; //文件类型 private String fileOpContentType; // 接受依赖注入的属性 private String savePath; /* * 上传文件,把异常往外抛,声明式异常处理,把异常交给struts的xml来进行配置处理,可见strut2的配置xml */ public String fileUpload() throws IOException{ //服务器上的路径 String realpath = ServletActionContext.getServletContext().getRealPath("/upfiles"); System.out.println("realpath: "+realpath); if (fileOp != null) { File savefile = new File(new File(realpath), fileOpFileName); if (!savefile.getParentFile().exists()){ /**如果文件夹不存在,就创建一个文件夹**/ savefile.getParentFile().mkdirs(); } FileUtils.copyFile(fileOp, savefile); //调用struts2的上传组件,进行文件写入 //没有抛异常,说明文件上传成功 System.out.println("文件上传成功!"); } return "success"; } /* * 通过IO流去上传文件,采用手动处理异常,这样不够简洁 */ public String fileUploadOther(){ FileOutputStream os = null; FileInputStream is = null; try { // 建立文件输出流 System.out.println(getSavePath()); os = new FileOutputStream(getSavePath() + "\\" + getFileOpFileName()); // 建立文件上传流 is = new FileInputStream(getFileOp()); byte[] buffer = new byte[1024]; int len = 0; while ((len = is.read(buffer)) > 0) { os.write(buffer, 0, len); } } catch (Exception e) { System.out.println("文件上传失败"); e.printStackTrace(); } finally { close(os, is); } return "success"; } /* * 关闭IO流 */ private void close(FileOutputStream os, FileInputStream is) { if (is != null) { try { is.close(); } catch (IOException e) { System.out.println("FileInputStream关闭失败"); e.printStackTrace(); } } if (os != null) { try { os.close(); } catch (IOException e) { System.out.println("FileOutputStream关闭失败"); e.printStackTrace(); } } } public File getFileOp() { return fileOp; } public void setFileOp(File fileOp) { this.fileOp = fileOp; } public String getFileOpFileName() { return fileOpFileName; } public void setFileOpFileName(String fileOpFileName) { this.fileOpFileName = fileOpFileName; } public String getFileOpContentType() { return fileOpContentType; } public void setFileOpContentType(String fileOpContentType) { this.fileOpContentType = fileOpContentType; } public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } }