struts2之如何向服务器上传文件

转载请注明:

问题:在struts2框架下实现文件上传

方案:struts2提供了拦截器可以自动实现文件上传,并且该拦截器存在于defaultStack中,是每个action默认使用的。复用之前的案例。

步骤一:打开上传页面

在struts.xml中,配置打开上传页面的action,代码如下:

</pre><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"""><struts><!–package:包,用于对action进行封装–><package name="customer" namespace="/customer" extends="struts-default"><interceptors><!– 注册拦截器 –><interceptor name="first" class="interceptor.FirstInterceptor"></interceptor><interceptor name="second" class="interceptor.SecondInterceptor"></interceptor> <!– 注册拦截器栈 –> <interceptor-stack name="myStack"> <interceptor-ref name="first"></interceptor-ref> <interceptor-ref name="second"></interceptor-ref> </interceptor-stack></interceptors><!– 设置当前包下所有Action默认引用的拦截器 –><default-interceptor-ref name="myStack"></default-interceptor-ref><!– 打开修改页面 –><action name="toUpdateCustomer" class="action.ToUpdateCustomerAction" ><!– 引用拦截器 –><!– <interceptor-ref name="first"></interceptor-ref> –><result name="success">/WEB-INF/customer/update_customer.jsp</result></action></package><!– 文件上传示例 –><package name="demo" namespace="/demo" extends="struts-default"><!– 打开上传文件页面 –><action name="toUpload"><result name="success">/WEB-INF/jsp/upload.jsp</result></action></package></struts>

在WEB-INF下创建jsp文件夹,,并在此文件夹下创建文件上传页面upload.jsp,代码如下:

<%@page pageEncoding="utf-8"%><html><head><body><form action="" method="post"><input type="file" name="some"/><input type="submit" value="提交"></form></body></head></html>

重新部署并启动tomcat,访问此页面,效果如下图:

点击选择文件后,则就像平时在网站上上传了文件一样。但是此时点击提交并无什么作用。因为我们还没有处理这个请求。

下面进行这方面的处理。

步骤二:导包

上传文件需要依赖新的包commons-io-1.3.2.jar将其引入到项目中后,包结构如下图:

步骤三:Action中处理上传请求

由于Action需要接受拦截器传入的临时文件,并对临时文件进行复制,因此需要提供一个文件操作的工具类FileUtil,代码如下:

package util;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;public class FileUtil {public static boolean copy(File src,File dest){BufferedInputStream bufferedInputStream=null;BufferedOutputStream bufferedOutputStream=null;try { bufferedInputStream=new BufferedInputStream(new FileInputStream(src)); bufferedOutputStream=new BufferedOutputStream(new FileOutputStream(dest)); byte[] bts=new byte[1024]; int len=-1; while((len=bufferedInputStream.read(bts))!=-1){ bufferedOutputStream.write(bts,0,len); } return true;} catch (Exception e) {e.printStackTrace();return false;}finally{if(bufferedInputStream!=null){try {bufferedInputStream.close();} catch (Exception e2) {e2.printStackTrace();}}if(bufferedOutputStream!=null){try {bufferedOutputStream.close();} catch (Exception e3) {e3.printStackTrace();}}}}}

、然后创建上传文件Action类uploadAction,并根据拦截器传入的临时文件,将其赋值到某路径下。代码如下:

package action;import java.io.File;import org.apache.struts2.ServletActionContext;import util.FileUtil;//文件上传public class UploadAction {//接受拦截器传入的临时文件private File some;//接受拦截器注入的原始文件名private String someFileName;public String execute(){if(some==null)return "error";//将文件放于项目部署路径下的upload文件夹下String path="WEB-INF/upload/"+ someFileName;//根据相对部署路径计算完整路径path=ServletActionContext.getServletContext().getRealPath(path);//将临时文件复制到上述路径下FileUtil.copy(some, new File(path));return "success";}public File getSome() {return some;}public void setSome(File some) {this.some = some;}public String getSomeFileName() {return someFileName;}public void setSomeFileName(String someFileName) {this.someFileName = someFileName;}}

勤勉是通往胜利的必经之路。要是由于胆怯艰难而去另觅佳径,

struts2之如何向服务器上传文件

相关文章:

你感兴趣的文章:

标签云: