Struts2文件上传
=======================上传(过滤大小及类型)下载文件(弹出框以流的方式下载)=======================
1)上传jsp:
<form enctype="multipart/form-data" action="fileUpLoadAction.action" method="post"> <h3 align="center"> Struts2文件上传示例 </h3> 用户名: <input type="text" name="uname" /> <br /> 年龄: <input type="text" name="age" /> <br /> 照片: <input type="file" value="选择图片" name="image2" /> <input type="submit" value="上传" /> </form>
注:1) enctype="multipart/form-data" 表单中如果要上传附件那么这里要加这个属性,作用是表单是的数据以二进制形式提交
2) method="post" 有附件上传那么提交方式必然是post方式
2) 上传Action:
/* * 必须继承ActionSupport类,则否fileUpload拦截器无效 */ public class FileUpLoadAction extends ActionSupport { private static final long serialVersionUID = 1L; private File image2; // 变量名必须与jsp页面中的file控件的name相同 private String image2FileName; // 必须--File变量的名字+ "FileName" private List<String> listNames; public File getImage2() { return image2; } public void setImage2(File image2) { this.image2 = image2; } public String getImage2FileName() { return image2FileName; } public void setImage2FileName(String image2FileName) { this.image2FileName = image2FileName; } public List<String> getListNames() { return listNames; } public void setListNames(List<String> listNames) { this.listNames = listNames; } public String execute() throws Exception { // 放图片的路径:E:\apache-tomcat-6.0.18\webapps\StrutsFileUpDown\images String realpath = ServletActionContext.getServletContext().getRealPath("/images"); //不存在则创建,代码没写 if (image2 != null) { // 放图片的路径+图片的名称 File savefile = new File(realpath + "/" + image2FileName); // FileUtils.copyFile(file1,file2);file1,file2都是文件类型File;把file1拷贝到file2 FileUtils.copyFile(image2, savefile); } // 接收用户名和年龄 String userName = ServletActionContext.getRequest().getParameter("uname"); String age = ServletActionContext.getRequest().getParameter("age"); /** * 读取文件名列表 */ //读取图片的名称返回一个list列表 listNames = findFileNames(realpath ); return "success"; } /** * 读取文件名的列表 * * @param path * 放图片的路径 * @return 把路径中的图片名取出来存在List里 */ private List<String> findFileNames(String path) { List<String> listNames = new ArrayList<String>(); File file = new File(path); File[] files = file.listFiles(); for (File f : files) { if (f.isFile()) { // 得到图片的名称 123.jpg String fileName = f.getName(); listNames.add(fileName); } } return listNames; } }
3)下载Action
public class DownloadAction { private String fileName; public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public InputStream getInputStream() { System.out.println("getFileName()="+getFileName()); InputStream ins = ServletActionContext.getServletContext().getResourceAsStream("/images/" + fileName); return ins; //查找具有给定名称的资源。返回 inputstream //相当于取得File文件后,再new InputStream(file)一样的结果 //以'/'开头时默认是从此类所在的包下取资源,以'/'开头则是从ClassPath(Src根目录)根下获取。 //E:\apache-tomcat-6.0.18\webapps\StrutsFileUpDown\images 其实E:\apache-tomcat-6.0.18\webapps \StrutsFileUpDown\就是根 } public String execute(){ return "success"; //下载不用写返回页面 } }
注:execute()必须走,走 execute(),在走getInputStream --------->把附件以流的方式写入浏览器中,以弹出框的形式下 载
4)struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8" /> <package name="filePackage" extends="struts-default"> <action name="fileUpLoadAction" class="com.cs.fileupload.action.FileUpLoadAction"> <result name="success">index.jsp</result> <result name="input">error.jsp</result> <!-- input意思是当上传的文件大小和类型不符合要求时就会返回一个input,这个input在ActionSupport 类中所以上传类必须继承ActionSupport --> <!-- 文件上传拦截器,struts自已写好的,我们调用就可以了 --> <interceptor-ref name="fileUpload"> <!-- 上传文件的文件类型要求是哪几个类型,并且以,号分隔 --> <param name="allowedTypes">image/bmp,image/png,image/gif</param> <!-- 上传文件的文件的大小允许是多少字节 --> <param name="maximumSize">102400</param> </interceptor-ref> <interceptor-ref name="defaultStack" /> </action> <action name="downloadAction" class="com.cs.fileupload.action.DownloadAction"> <!-- 可以实现文件的下载功能 --> <result type="stream"> <!-- 让浏览器总是提示一个文件下载对话框 --> <param name="contentType">application/octet-stream</param> <!-- 返回的InputStream对象将被发送到浏览器 --> <param name="inputName">inputStream</param> <!-- 文件处理方式 ${}内部为ognl表达式--> <param name="contentDisposition">attachment;fileName=${fileName}</param> <!-- 通过OutputStream对象向浏览器发送数据时使用的缓冲区的长度,为了是提高文件的下载速度 --> <param name="bufferSize">4096</param> </result> </action> </package> </struts>
5)错误页面 error.jsp
<%@ taglib uri="/struts-tags" prefix="s"%> <body> <!-- 上传如果发错会进入这个页面,并用这个标签显出错误信息,并且以英文的方式显示出来--> <h3><s:fielderror/></h3> <h4><a href="fileUpLoadAction.action">返回图片上传页</a></h4> </body>
出错信息在:
传输文件时的信息解释:(struts核心包下/org.apache.struts2/struts-messages.properties文件里)
struts.messages.error.content.type.not.allowed=不支持上传该类型的文件
struts.messages.error.file.too.large=上传图片失败:图片太大
struts.messages.error.uploading=上传文件时发生错误
===========================页面用struts标签==========================================
1)如果页面用struts标签。
2)web.xml中配置时用的是
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
那么访问JSP时就报错,找不到struts标签,因为配置时用的是*.action,只有.action形式才走struts框架,那么这时我们就可以把配置改下加
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
这样我们就可以在访问jsp时,让它走struts框架。
web.xml完整代码:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
3)还有另外一种方法是把*.action改成/*