先谈一谈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 标签引用<%@taglib 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多文件上传和单文件下载就实现了。
以上就是本文的全部内容,希望对大家的学习有所帮助。
本文地址:https://www.stayed.cn/item/3030
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我