package com.xtsw.file.control;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.xtsw.file.dao.Impl.DownLoadDao;
import com.xtsw.file.util.LogUtil;public class DownLoadServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DownLoadDao td = new DownLoadDao();
OutputStream toClient = null;
InputStream fis = null;
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");
int clicks = Integer.parseInt(request.getParameter("clicks"));
int file_id = Integer.parseInt(request.getParameter("file_id"));
String filename = request.getParameter("file_name");
String filefilename = td.getList(file_id, filename);
try {
//清除空白文档,不能进行关闭
response.reset();
// 设置response的Header,前面一个为名字,是不是默认名?,后面一个为值。
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes(), "iso-8859-1"));
response.addHeader("Content-Type", "application/octet-stream"); // 以流的形式下载文件。                        //下面这个是做什么的
fis = new BufferedInputStream(new FileInputStream(filefilename));
toClient = new BufferedOutputStream(response.getOutputStream());
copy(fis, toClient);//为什么要用这个方法?
toClient.flush(); td.update(clicks, file_id);
} catch (RuntimeException e) {
LogUtil.outLog(e.getMessage());
} finally {
if (fis != null) {
fis.close();
}
if (toClient != null) {
toClient.close();
} }
} public void copy(InputStream input, OutputStream output) {
byte[] buffer = new byte[1024 * 4];
int n = 0;
try {
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
} catch (IOException e) {
LogUtil.outLog(e.getMessage());
// System.out.println(e.getMessage());
}
}}

解决方案 »

  1.   

    严格来说,你这不是下载,只是将你的数据入到一个文件,而文件本身,你是以欺骗浏览器的方式建立的。
    你那个FileName以后的是名字
    后面那是文件输入输出的流
    那个方法不是必须的
    看下我写的代码吧,呵呵,虽然很菜,逻辑上应该比较清楚。
    代码目的:
    从数据库中查出记录,存入数组,在按照csv的格式输出,输出的名字是BX.csv
    可以使用excel打开,当然效果也是所谓的下载啦。String FileName = "BX.csv";      //导出文件名称
    String sql="select * from businessionfo,BasicInfo ";
    sql=sql+"where businessionfo.id=BasicInfo.id";String st[][]=mysql.executeQuery(sql,strDB);//查出数据
    String str[]=new String[st.length];
    for (int i = 0; i < st.length; i++)//调整格式为csv可存为excel方式
    {
       for (int j = 0; j < st[0].length; j++)
       {
      if(j==(st[0].length-1))
    s2=s2+st[i][j];
       else
      s2=s2+st[i][j]+",";
        }
        str[i]=s2;
        s2="";
    }
    response.setContentType("application/octet-stream;charset=GB2312"); response.setHeader("Content-Disposition","attachment; filename=\"" + FileName + "\"");//骗浏览器了,或者换个说法,就是给浏览器一个不能识别的文件
    try
    {
    //其实可以加个表头的,在这里,为了简单,省略了
    for(int i=0;i<str1.length;i++)
    {
    response.getWriter().write(str[i]);//输出值 response.getWriter().write("\n");//输出换行
    }
    }
    catch (IOException e)
    {
           e.printStackTrace();
    }
      

  2.   

    中间两件话没了,补上:
    response.setContentType("application/octet-stream;charset=GB2312"); response.setHeader("Content-Disposition","attachment; filename=\"" + FileName + "\"");
      

  3.   

    这个是下载程序,把fileInputStream读入的内容写到response.getOutputStream 流里,可以进行下载还有个逻辑就是记录下载次数到数据库里,就这么简单