java中struts2实现文件上传下载功能
程序员文章站
2024-03-11 12:20:07
先谈一谈struts2实现文件的上传和下载实例实现的原理:
struts 2是通过commons fileupload文件上传。
commons fileupload通...
先谈一谈struts2实现文件的上传和下载实例实现的原理:
struts 2是通过commons fileupload文件上传。
commons fileupload通过将http的数据保存到临时文件夹,然后struts使用fileupload拦截器将文件绑定到action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。
具体实现:
一、创建index.jsp页面
<body> <s:form action="upload" method="post" theme="simple" enctype="multipart/form-data"> <table align="center" width="50%" border="1"> <tr> <td>选择上传文件</td> <td id="more"> <s:file name="file"></s:file> <input type="button" value="add more.." onclick="addmore()"> </td> </tr> <tr> <td><s:submit type="button" value="submit" onclick="return checkf()"/></td> <td><s:reset value="reset "></s:reset></td> </tr> </table> <table align="center" width="50%" border="1"> <tr> <td>测试.txt</td> <td> <a href="<s:url value='download.action'><s:param name='filename'>测试.txt</s:param> </s:url>">下载</a> </td> </tr> </table> </s:form> </body>
创建result.jsp页面
<body> <s:form> <div style="border:1px solid black">成功上传的文件:<br> <ul style="list-style-type:decimal"> <s:iterator value="#request.filename" id="file" status="status"> <li><s:property/> </li> </s:iterator> </ul> </div> </s:form> </body>
当然别忘了在每个页面上都添加上struts2 标签引用< prefix="s" uri="/struts-tags" %>
二、创建updown.js文件,在index.jsp中引用
function checkf(){ var files = document.getelementsbyname("file"); if(files[0].value.length!=0){ return true; }else{ alert("请选择文件"); return false; } } function addmore() { var td = document.getelementbyid("more"); var br = document.createelement("br"); var input = document.createelement("input"); var button = document.createelement("input"); input.type = "file"; input.name = "file"; button.type = "button"; button.value = "remove"; button.onclick = function() { td.removechild(br); td.removechild(input); td.removechild(button); } td.appendchild(br); td.appendchild(input); td.appendchild(button); }
三、创建updownloadaction.java
package com.action; import java.io.file; import java.io.fileinputstream; import java.io.filenotfoundexception; import java.io.fileoutputstream; import java.io.inputstream; import java.io.outputstream; import java.io.unsupportedencodingexception; import java.util.list; import javax.servlet.http.httpservletrequest; import com.opensymphony.xwork2.actionsupport; import org.apache.struts2.servletactioncontext; public class updownloadaction extends actionsupport { private static final long serialversionuid = 1l; private list<file> file;// 对应jsp中file标签 private list<string> filefilename;// private list<string> filecontenttype;// private string filename;//获得jsp中pram参数 @suppresswarnings("deprecation") // 文件上传 public string uploadfiile() throws exception { string root = servletactioncontext.getservletcontext().getrealpath( "/upload");// 上传路径 system.out.println(root); inputstream inputstream; file destfile; outputstream os; for (int i = 0; i < file.size(); i++) { inputstream = new fileinputstream(file.get(i)); destfile = new file(root, this.getfilefilename().get(i)); os = new fileoutputstream(destfile); byte[] buffer = new byte[400]; int length = 0; while ((length = inputstream.read(buffer)) > 0) { os.write(buffer, 0, length); } inputstream.close(); os.close(); } httpservletrequest request = servletactioncontext.getrequest(); request.setattribute("filename", filefilename); return success; } // 文件下载 public inputstream getdownloadfile() throws filenotfoundexception, unsupportedencodingexception { system.out.println(getfilename()); // 如果下载文件名为中文,进行字符编码转换 servletactioncontext.getresponse().setheader("content-disposition","attachment;filename=" + java.net.urlencoder.encode(filename, "utf-8")); inputstream inputstream = new fileinputstream("f:/" //使用绝对路径 ,从该路径下载“测试.txt"文件 + this.getfilename()); system.out.println(inputstream); return inputstream; } // 下载 public string downloadfile() throws exception { return success; } public string getfilename() throws unsupportedencodingexception { return filename; } public void setfilename(string filename) throws unsupportedencodingexception { this.filename = new string(filename.getbytes("iso8859-1"), "utf-8"); } }
注:属性的 get和set方法已省略。
四、最后是配置文件
1、web.xml配置
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filterdispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2、struts.xml配置
<struts> <constant name="struts.i18n.encoding" value="utf-8"></constant> <constant name="struts.multipart.savedir" value="f:\"></constant> <package name="struts2" extends="struts-default"> <action name="upload" class="com.action.updownloadaction" method="uploadfiile"> <result name="success">/jsp/result.jsp</result> <interceptor-ref name="fileupload"> <!--maximumsize (可选) - 这个拦截器允许的上传到action中的文件最大长度(以byte为单位). 注意这个参数和在webwork.properties中定义的属性没有关系,默认2mb--> <param name="maximumsize">409600</param> <!--allowedtypes (可选) - 以逗号分割的contenttype类型列表(例如text/html), 这些列表是这个拦截器允许的可以传到action中的contenttype.如果没有指定就是允许任何上传类型.--> <param name="allowedtypes"> text/plain </param> </interceptor-ref> <interceptor-ref name="defaultstack"></interceptor-ref> </action> <action name="download" class="com.action.updownloadaction" method="downloadfile" > <result name="success" type="stream"> <!--指定文件下载类型 application/octet-stream默认值可以下载所有类型 --> <param name="contenttype"> application/txt; </param> <!-- 指定下载的文件名和显示方式 ,但注意中文名的乱码问题,解决办法是:进行编码处理--> <!--contentdisposition是文件下载的处理方式,包括内联(inline)和附件(attachment), 默认是inline, 使用附件时这样配置:attachment;filename="文件名" 。--> <param name="contentdisposition"> attachment;filename="${filename}" </param> <!--由getdownloadfile()方法获得inputstream--> <param name="inputname">downloadfile</param> <!-- 指定下载文件的缓存大小--> <param name="buffersize">2048</param> </result> </action> </package> </struts>
一个简单的struts2多文件上传和单文件下载就实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助。
上一篇: asp.net 多数据库支持的思考