struts2上传下载

struts2单文件上传:

首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框

<!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,
  不然就会以二进制文本上传到服务器端--> 
      <s:actionerror/><br/>
  <!--注意:添加命名空间namespace="/"、否则在第一次上传之后地址将发生改变-->
  <!--注意:2.enctype="multipart/form-data"规定上传类型 否则上传文件在那头会出错-->
  <s:form action="upload" enctype="multipart/form-data" namespace="/" method="POST">
   <!--做标记用  用来判断是否重复登陆-->
   <s:token/>
   <s:file name="myFile" label="文件上传"/>
   <s:textfield name="name" label="用户名"/>
   <s:submit value="提交"/>
  </s:form>

  <h2>文件下载内容:</h2><br/>  
   a.html:<a href="down">点击下载</a><br/>  
<!--struts.xml -->
 <package name="my" namespace="/" extends="struts-default">
   <action name="upload" class="com.cn.struts.action.MyFileUploadAction">
    <result>/success.jsp</result>
   </action>
  <action name="down" class="com.cn.struts.action.MyDownloadAction">
   <result type="stream">
    <param name="bufferSize">1024</param>
   </result>
 </action>
  </package>

接下来是FileUploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:

package com.cn.struts.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class MyFileUploadAction extends ActionSupport{


      public File getMyFile() {
        return myFile;
    }

    public void setMyFile(File myFile) {
        this.myFile = myFile;
    }

    public String getMyFileContentType() {
        return myFileContentType;
    }

    public void setMyFileContentType(String myFileContentType) {
        this.myFileContentType = myFileContentType;
    }

    public String getMyFileFileName() {
        return myFileFileName;
    }

    public void setMyFileFileName(String myFileFileName) {
        this.myFileFileName = myFileFileName;
    }

      private File myFile;// 上传来的文件
      private String myFileContentType;// 上传文件的类型
      private String myFileFileName;// 上传文件的名字 





    public String execute() throws Exception {
       //1.获得输入流
       InputStream in=new FileInputStream(myFile);
       //2.获得文件存储路径


       //tomcat下webapps 项目名
       File toDir=new File(ServletActionContext.getServletContext().getRealPath("/upload"));
       //3.判断是文件路径是否存在,不存在则创建文件
       if(toDir.exists()==false){
        toDir.mkdir();
       }

       System.out.println(toDir.getAbsolutePath());
       //4.输出流
       OutputStream out=new FileOutputStream(new File(toDir,myFileFileName));

       byte[] bs=new byte[1024];
       int len=0;

       while((len=in.read(bs))!=-1){
        out.write(bs,0,len);
       }
       out.flush();

       in.close();
       out.close();

       return "success";
      }
}

首先我们要清楚一点,这里的myFile并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。

文件上传后我们还需要将其下载下来,其实struts2的文件下载原理很简单,就是定义一个输入流,然后将文件写到输入流里面就行,关键配置还是在struts.xml这个配置文件里配置:

FileDownloadAction代码如下:

package com.cn.struts.action;

import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class MyDownloadAction extends ActionSupport{
    protected String contentType;//下载内容类型
      protected long contentLength;//下载内容长度
      protected String contentDisposition;//下载内容配置(名字)
      protected InputStream inputStream;//输入流
      public String execute() throws Exception{
       contentType="text/html";
       //contentDisposition="attachment;filename="+new String("你好.html".getBytes(), "iso-8859-1");
       contentDisposition="attachment;filename="+URLEncoder.encode("你好.html", "iso-8859-1");//转码  firebug不会识别这个utf-8

       String downloadPath=ServletActionContext.getServletContext().getRealPath("/upload/a.html");
       inputStream=new FileInputStream(downloadPath);
       contentLength=inputStream.available();

       return "success";
      }

      public String getContentType() {
       return contentType;
      }
      public void setContentType(String contentType) {
       this.contentType = contentType;
      }
      public long getContentLength() {
       return contentLength;
      }
      public void setContentLength(long contentLength) {
       this.contentLength = contentLength;
      }
      public String getContentDisposition() {
       return contentDisposition;
      }
      public void setContentDisposition(String contentDisposition) {
       this.contentDisposition = contentDisposition;
      }
      public InputStream getInputStream() {
       return inputStream;
      }
      public void setInputStream(InputStream inputStream) {
       this.inputStream = inputStream;
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值