在Tomcat里,我写了一个jsp文件实现打开PDF文件,
通过IE来访问这个PDF文件
但是,IE出现错误提示,无法下载来自JSP的文件
无法打开该站点,请求的站点不可用,或者找不到
我使用的是IE7版本,但是换个IE6的就可以
后来使用了opera浏览器也可以正常的打开PDF的文件
请问这个jsp的代码有问题呢?
还是跟浏览器的设置有关系?
jsp代码如下: String  filepath="D:\\JAVA\\Tomcat\\webapps\\newReports\\"; 
 String filename = new String(request.getParameter("filename").getBytes("GB2312")); 
 response.setHeader("Content-Type","application/pdf"); 
 response.setHeader("Content-Disposition","attachment;filename="+filename); 
 response.setHeader("Connection","close"); 
 
 ServletOutputStream  sos=response.getOutputStream(); 
 FileInputStream    fis= new  FileInputStream(filepath+filename); 
 byte b[]=new byte[1000]; 
 int j; 
 while((j=fis.read(b))!=-1){sos.write(b,0,j);} 
  fis.close(); 
  sos.flush(); 
  sos.close(); 

解决方案 »

  1.   

    关于文件下载,我这有个servlet里方法的例子,就连html文件也是弹出下载框而不是网页直接打开,给LZ参考参考: public void download(HttpServletRequest request, HttpServletResponse response){
    response.setContentType("application/x-download");                // 设置为下载application/x-download
    String name = null;
    try {
    name = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "GBK"); //################设置获取参数的编码
    } catch (UnsupportedEncodingException e1) {
    e1.printStackTrace();
    }
        String filenamedownload = "/files/" + name;                    // 即将下载的文件的相对路径
        String filenamedisplay = name;                          // 下载文件时显示的文件保存名称
        try {
        
    filenamedisplay = URLEncoder.encode(filenamedisplay,"gbk");
    response.addHeader("Content-Disposition","attachment;filename=" + filenamedisplay);

            RequestDispatcher dispatcher = request.getRequestDispatcher(filenamedownload);
            if(dispatcher != null) {
                dispatcher.forward(request,response);
            }
            response.flushBuffer();
        }
        catch(Exception e) {
            e.printStackTrace();
    }
    }
      

  2.   

    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.net.URLEncoder;import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    这是我那个servlet导入的包
      

  3.   

    读库里的文件
    String filename = "Report." + rs.getString("FILETYPE");

    response.setHeader("Content-Disposition","attachment;filename="+new String(filename.getBytes("GBK"),"iso8859-1")); 
    response.setContentType(rs.getString("FILETYPE"));
    OutputStream os = response.getOutputStream();

    Blob blob = rs.getBlob("REPORTFILE");
    byte[] bytes = new byte[(int)blob.length()];
    InputStream ins = blob.getBinaryStream(); int length;
    while ((length = ins.read(bytes)) != -1)
    {
    os.write(bytes, 0, length);
    }
    response.setStatus(response.SC_OK);
    response.flushBuffer();
    读硬盘文件:
    response.setContentType("pdf");
    response.setHeader("Content-Disposition","attachment; filename=\"XXX.pdf\"");String strFileName = "X:\\XXX.pdf"; 
    OutputStream outputStream = response.getOutputStream();
    InputStream inputStream = new FileInputStream(strFileName); byte[] buffer = new byte[65536];
     int i = -1;
     while ((i = inputStream.read(buffer)) != -1) 
     {
      outputStream.write(buffer, 0, i);
      }
     outputStream.flush();
     outputStream.close();
     inputStream.close();
     outputStream = null;
      

  4.   

    另外我遇到过,IE7里面如果byte[] buffer = new byte[65536];大小是固定值,页面会有问题,
    当时我的情况是把BLOB的文本写到界面,发现界面下面的BUTTON无法显示,但是在IE6里面是没问题的,
    后来改成用byte[] bytes = new byte[(int)blob.length()]; 在两个版本的浏览器里都没问题.
      

  5.   

    如果我不是使用BLOB文件,
    仅仅是打开一个文件
    那我byte[] bytes = new byte[?] ?的长度应该怎么去确定呢?
      

  6.   

    我的问题解决了
    重新写了代码
    如下:
            BufferedInputStream inputStream = null;
            byte[] fileByte = new byte[1024];
            int fileLen = 0;
            String filename = request.getParameter("filename");
            File file = new File("D:\\JAVA\\Tomcat\\webapps\\newReports\\"+filename);
            if (file.exists()) {
                inputStream = new BufferedInputStream(new FileInputStream(file));
            } else {
                try {
    throw new Exception("file not found");
    } catch (Exception e) {
    e.printStackTrace();
    }
            }
            response.reset();
            response.setContentType("application/pdf");
           
            OutputStream outStream = response.getOutputStream();
            while ((fileLen = inputStream.read(fileByte)) != -1) {
                
                outStream.write(fileByte,0,fileLen);
            }
            inputStream.close();
            outStream.close(); 仍然谢谢各位支持