struts2文件下载的实现事例

文件下载在实际java开发中运行非常广泛,下面写一个struts2文件下载的实现事例:

struts2.xml配置:

1 <action name=”ExportDB” class=”edu.xjtu.sei.xxxx.action.DBManager.ExportDBAction”>
2             <result name="success" type="stream">
3                 <param name="contentType">application/octet-stream</param>
4                 <param name="inputName">inputStream</param>                
5                 <param name="bufferSize">409600</param>
6                 <param name="contentDisposition">attachment;filename="${filename}"</param>
7                 <param name=""></param>
8             </result>    
9         </action >

ExportDBAction.java

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.struts2.json.annotations.JSON;
import com.opensymphony.xwork2.ActionSupport;

import edu.xjtu.sei.xxx.business.dao.HostInfectDAO;
import edu.xjtu.sei.xxx.util.DateUtils;

public class ExportDBAction extends ActionSupport{
    String filename;
    String flag;
    String errormessage;
    String properties;

    private HostInfectDAO hostinfectdao;
   public void setHostInfectDAO(HostInfectDAO hostinfectdao) {
        this.hostinfectdao = hostinfectdao;
    }

public String getProperties() {
        return properties;
    }
    public void setProperties(String properties) {
        this.properties = properties;
    }
    boolean success;
    public String execute() {

        success=true;
        return SUCCESS;   
                
        }
    public String getFilename() {
        return filename;
    }
    public void setFilename(String filename) {
        this.filename = filename;
    }
    public String getFlag(){
        return flag;
    }
    public void setFlag(String flag){
        this.flag=flag;
    }
    public String getErrormessage() {
        return errormessage;
    }
    public void setErrormessage(String errormessage) {
        this.errormessage = errormessage;
    }
    public boolean isSuccess() {
        return success;
    }
    public void setSuccess(boolean success) {
        this.success = success;
    }
    public InputStream getInputStream() throws IOException {
        List results=null;
        StringBuilder export=new StringBuilder();
        results=hostinfectdao.getExportDB(flag);
        export.append("IP,域名,时间"+"\n");
        for (Iterator iter = results.iterator(); iter.hasNext();) {
            Object[] row=(Object[]) iter.next();            
            String ip=row[0].toString();
            String dns=row[1].toString();
            String time=DateUtils.formatDateEx((Date)row[3]).toString();            
            export.append(ip+","+dns+","+time+"\n");
        }
        ByteArrayInputStream stream = new ByteArrayInputStream(export.toString().getBytes("gbk"));   
        return stream; 

        }

    public static void main(String args[]) throws IOException{
        ExportDBAction a=new ExportDBAction();
        a.setProperties("1");
        a.getInputStream();
    }
}

请求action的js函数:

function exportTable(filename,flag){
        //window.location.href = "ExportDB.action?filename="+filename+".csv&flag="+flag+"&contentType=application/octet-stream";
     window.location.href = "ExportDB.action?filename="+filename+".csv&flag="+flag;
    }

之前IE浏览器下载的时候一直自动打开文件。
那时struts.xml里的<param name=”contentDisposition”>attachment;filename=”${filename}”</param>

是这样写的:<param name=”contentDisposition”>filename=”${filename}”</param>

后来把attachment加上就好了。

参考文章说的很清楚:

要直接下载一个文件,我们需要做两件事,

第一件事是:设定响应的内容类为“application/octet-stream”,大小写无关。

第二件事是:设置HTTP的响应头名字为:Content-Disposition,设定值为:attachment;   filename   =   theFileName。这里的theFileName就是出现在文件下载对话框里的默认文件名,通常和所下载的文件名字相同,但也可以不同。

jsp页面的实现代码:

html代码:

      <%  
      //   得到文件名字和路径  
      String   filename   =   "MengxianhuiDocTest.doc";  
      String   filepath   =   "D:\\";  

      //   设置响应头和下载保存的文件名  
      response.setContentType("APPLICATION/OCTET-STREAM");  
      response.setHeader("Content-Disposition",  
      "attachment;   filename=\""   +   filename   +   "\"");  

      //   打开指定文件的流信息  
      java.io.FileInputStream   fileInputStream   =  
      new   java.io.FileInputStream(filepath   +   filename);  

      //   写出流信息  
      int   i;  
      while ((i=fileInputStream.read())   !=   -1)   {  
        out.write(i);  
      }  
      fileInputStream.close();  
      out.close();  
    %>

标签