我想在jboss的/server/default/deploy/ 下创建一个文件夹,如 temp, 下面有一个文档a.word.
然后我有一个war包叫做 test.war, 现在希望从这个war包程序里,指向temp/a.word ,然后提供一个下载框给用户下载。我知道response.sendRedirect可以达到这个效果,但是它会导致浏览器路径改变,所以有没有其他方法呢?

解决方案 »

  1.   

    你直接是流加载然后向客户端输出 word格式的流即可
    response.setCharacterEncoding("GBK");
    ServletOutputStream out1 = response.getOutputStream();
    int act = Integer.parseInt(request.getParameter("act"));
    String filename="";
    if(act==1)filename="1.rar";
    else if(act==2)filename="2.rar";
    else if(act==3)filename="3.rar";
    else filename="c.rar";
    File file2 = new File("d:\\"+filename);
    if (!file2.exists()) {
    response.setContentType("application/x-download");
    out1.print("file doesn't exist");
    return;
    }else {
    response.setHeader("Content-Disposition",
    "attachment; filename=default\"" + "zip"  + "\"");
    filename=filename.substring(filename.lastIndexOf("\\"));
    response.setHeader("Content-Disposition", "attachment; filename=\""
    + filename + "\"");
    } BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
    bis = new BufferedInputStream(new FileInputStream(file2));
    bos = new BufferedOutputStream(out1);
    byte[] buff = new byte[2048];
    int bytesRead;
    while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
    bos.write(buff, 0, bytesRead);
    }
    } catch (IOException e) {
    throw e;
    } finally {
    if (bis != null)
    bis.close();
    if (bos != null)
    bos.close();
    }
      

  2.   

    在代码中使用filestream读取word文件以流的方式通过response输出到客户端就可以了。需要设置响应消息头。
    参考:
    在JSP里下载附件的代码
     一、采用RequestDispatcher的方式进行 1、web.xml文件中增加 
    <mime-mapping> 
    <extension>doc</extension> 
    <mime-type>application/vnd.ms-word</mime-type> 
    </mime-mapping> 
    2、程序如下: <%@page language="java" import="java.net.*" pageEncoding="gb2312"%> 
    <% 
    response.setContentType("application/x-download");//设置为下载application/x-download 
    String filenamedownload = "/系统解决方案.doc";//即将下载的文件的相对路径 
    String filenamedisplay = "系统解决方案.doc";//下载文件时显示的文件保存名称 
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8"); 
    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay); try 

    RequestDispatcher dispatcher = application.getRequestDispatcher(filenamedownload); 
    if(dispatcher != null) 

    dispatcher.forward(request,response); 

    response.flushBuffer(); 

    catch(Exception e) 

    e.printStackTrace(); 

    finally 
    { } 
    %> 
    二、采用文件流输出的方式下载 1、web.xml文件中增加 
    <mime-mapping> 
    <extension>doc</extension> 
    <mime-type>application/vnd.ms-word</mime-type> 
    </mime-mapping> 
    2、程序如下: <%@page language="java" contentType="application/x-msdownload" import="java.io.*,java.net.*" pageEncoding="gb2312"%><% 
    //关于文件下载时采用文件流输出的方式处理: 
    //加上response.reset(),并且所有的%>后面不要换行,包括最后一个; 
    //因为Application Server在处理编译jsp时对于%>和<%之间的内容一般是原样输出,而且默认是PrintWriter, 
    //而你却要进行流输出:ServletOutputStream,这样做相当于试图在Servlet中使用两种输出机制, 
    //就会发生:getOutputStream() has already been called for this response的错误 
    //详细请见《More Java Pitfill》一书的第二部分 Web层Item 33:试图在Servlet中使用两种输出机制 270 
    //而且如果有换行,对于文本文件没有什么问题,但是对于其它格式,比如AutoCAD、Word、Excel等文件 
    //下载下来的文件中就会多出一些换行符0x0d和0x0a,这样可能导致某些格式的文件无法打开,有些也可以正常打开。 response.reset();//可以加也可以不加 
    response.setContentType("application/x-download");//设置为下载application/x-download 
    // /../../退WEB-INF/classes两级到应用的根目录下去,注意Tomcat与WebLogic下面这一句得到的路径不同,WebLogic中路径最后没有/ 
    System.out.println(this.getClass().getClassLoader().getResource("/").getPath()); 
    String filenamedownload = this.getClass().getClassLoader().getResource("/").getPath() + "/../../系统解决方案.doc"; 
    String filenamedisplay = "系统解决方案.doc";//系统解决方案.txt 
    filenamedisplay = URLEncoder.encode(filenamedisplay,"UTF-8"); 
    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay); OutputStream output = null; 
    FileInputStream fis = null; 
    try 

    output = response.getOutputStream(); 
    fis = new FileInputStream(filenamedownload); byte[] b = new byte[1024]; 
    int i = 0; while((i = fis.read(b)) > 0) 

    output.write(b, 0, i); 

    output.flush(); 

    catch(Exception e) 

    System.out.println("Error!"); 
    e.printStackTrace(); 

    finally 

    if(fis != null) 

    fis.close(); 
    fis = null; 

    if(output != null) 

    output.close(); 
    output = null; 


    %>