如何从一个用struts的action里直接输出一个服务器端的文件? 
比如一个如何输出/export/test.xls到客户端下载?
最好不经过jsp.

解决方案 »

  1.   

    大概是这样,首先取得带路径的文件名然后
    try{
                response.setContentType("APPLICATION/OCTET-STREAM");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-Disposition","attachment; filename=\""+ filename + "\"");
                java.io.InputStreamReader in = new java.io.InputStreamReader(new java.io.FileInputStream(file),"utf-8");
                javax.servlet.ServletOutputStream sout = response.getOutputStream();
                char[] buf = new char[8192];
                while ( in.read(buf) != -1) {
                    sout.write((new String(buf)).getBytes("gb2312"));
                    
                }
                in.close();
                sout.close();
            }catch(Exception e){
                logger.debug(e.toString() );
                e.printStackTrace() ;
            }
    程序里的编码要改成你的文件的编码
      

  2.   

    file是带路径的文件名
    filename就是纯粹的文件名
    String filename = file ;
    String separator = System.getProperty("file.separator") ;
    filename = filename.substring(filename.lastIndexOf(separator)+1);
      

  3.   

    To vacuumboy(菜鸟依旧): 我是已经在action里生成了文件,现在要把这个文件输出到客户端,不必再读取这个文件了。
      

  4.   

    那就把内容用sout.write输出到客户端,但是文件名还是要的
      

  5.   

    文件名有问题,不是乱码就是象"CA63SP0L."这样的没有文件名的东西。
      

  6.   

    输出的文件内容没有问题。
    但输出的文件名有问题。
    一个是2006_柒哀璃厢o.xls
    另一个是CA0985WB代码如下String sheetName = departmentName + "\u65b0\u4ea7\u54c1\u4ea7\u91cf\u4fe1\u606f";      // export to client
    //      response.reset();//清空输出流
         
         response.setContentType("application/x-download");
    //      response.setContentType("APPLICATION/OCTET-STREAM");
         response.setContentType("application/msexcel");//定义输出类型
    //      response.setContentType("application/vnd.ms-excel; charset=UTF-8");      
         response.setCharacterEncoding("utf-8");
                     response.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");//设定输出文件头                 OutputStream os = response.getOutputStream();//取得输出流
         wb.write(os);
         
         os.flush();
         os.close();
      

  7.   

    应是
    String fileName = exportYear.toString() + "_" + departmentName + "\u65b0\u4ea7\u54c1\u4ea7\u91cf\u4fe1\u606f" + ".xls";
      

  8.   

    我在控制台看文件名是没有问题的。保存到本地也没有问题。
    如2006_空调新产品信息.xls
    但输出就不行了。