首页 > 代码库 > struts2中的文件上传,文件下载
struts2中的文件上传,文件下载
文件上传:
Servlet中的文件上传回顾
前台页面
1.提交方式post
2.表单类型 multipart/form-data
3.input type=file 表单输入项
后台
apache提交的FileUpload组件
核心类:
FileItemFactory FileItem的工厂
ServletFileUpLoad servlet中文件上传的核心类
FileItem 封装了上传表单文件项的信息
在servlet中文件上传处理起来比较麻烦。
struts框架对文件上传组件进行了简化
Struts的文件上传:
文件上传拦截器帮我们完成了文件上传的功能,而且struts2默认也使用了此拦截器
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
....
示例:
upload.jsp:
<body> <form action="${pageContext.request.contextPath }/fileUploadAction" method="post" enctype="multipart/form-data"> 用户名:<input type="text" name="userName"><br/> 文件:<input type="file" name="file1"><br/> <input type="submit" value="上传"> </form> </body>
处理action
public class FileUpload extends ActionSupport { // 对应表单:<input type="file" name="file1"> private File file1; //file1对应表单里的file1,依次类推可以多个上传框,struts已经帮我们获取到了该上传文件file1,并封装为File对象 // 文件名 private String file1FileName;//file1的文件名,依次类推可以多个,struts也已经拿到了该上传文件的文件名,可以在程序中直接使用。 // 文件的类型(MIME) private String file1ContentType; public void setFile1(File file1) { this.file1 = file1; } public void setFile1FileName(String file1FileName) { this.file1FileName = file1FileName; } public void setFile1ContentType(String file1ContentType) { this.file1ContentType = file1ContentType; } @Override public String execute() throws Exception { /******拿到上传的文件,进行处理******/ // 把文件上传到upload目录 // 获取上传的目录路径 获取路径要用servlet的api ActionContext无法获取路径 String path = ServletActionContext.getServletContext().getRealPath("/upload"); // 创建目标文件对象 File destFile = new File(path,file1FileName); // 把上传的文件,拷贝到目标文件中 FileUtils.copyFile(file1, destFile); return SUCCESS; } }
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <package name="upload_" extends="struts-default"> <!-- 注意: action 的名称不能用关键字"fileUpload" --> <action name="fileUploadAction" class="e_fileupload.FileUpload"> <!-- 限制运行上传的文件的类型 --> <interceptor-ref name="defaultStack"> <!-- 限制运行的文件的扩展名 --> <param name="fileUpload.allowedExtensions">txt,jpg,jar</param> <!-- 限制运行的类型 【与上面同时使用,取交集】 <param name="fileUpload.allowedTypes">text/plain</param> --> </interceptor-ref> <result name="success">/e/success.jsp</result> <!-- 配置错误视图 --> <result name="input">/e/error.jsp</result> </action> <action name="down_*" class="e_fileupload.DownAction" method="{1}"> <!-- 列表展示 --> <result name="list">/e/list.jsp</result> <!-- 下载操作 --> <result name="download" type="stream"> <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 --> <param name="contentType">application/octet-stream</param> <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 --> <param name="inputName">attrInputStream</param> <!-- 下载头,包括:浏览器显示的文件名 --> <param name="contentDisposition">attachment;filename=${downFileName}</param> <!-- 缓冲区大小设置 --> <param name="bufferSize">1024</param> </result> </action> </package> </struts>
文件上传细节处理
文件大小限制:
struts默认支持的文件上传最大是2M,可以通过常量配置方式来修改此值
在struts.xml配置常量为:
<constant name="struts.multipart.maxSize" value="http://www.mamicode.com/31457280" /> 设置最大上传文件大小为30M
错误提示:
当文件上传出现错误的时候,struts内部会返回input视图(错误视图),所以就需要我们再struts.xml中配置input视图对应的错误处理页面。
error.jsp
<body> error.jsp<br/> <!-- 查看struts框架在运行时期产生的所有错误信息 --> <%@ taglib uri="/struts-tags" prefix="s" %> <s:fielderror></s:fielderror> </body>
struts2中的文件上传,文件下载