欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java中struts2实现文件上传下载功能

程序员文章站 2024-03-11 23:08:13
先谈一谈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多文件上传单文件下载就实现了。

以上就是本文的全部内容,希望对大家的学习有所帮助。