Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AJAX在JSP中下载文件_Java_Jsp_Servlets - Fatal编程技术网

Java 使用AJAX在JSP中下载文件

Java 使用AJAX在JSP中下载文件,java,jsp,servlets,Java,Jsp,Servlets,我有一个简单的JSP页面,其中包含两个按钮:查看和导出。当点击查看按钮时,我将从数据库中获取数据,将副本保存到会话中,并将HTML代码写入带有数据的标签中。稍后,当用户单击“导出”时,我希望在服务器中生成一个excel文件(包含来自会话的数据),并将其下载到客户端 Excel文件已在服务器端成功创建。我正在使用客户端的AJAX请求从服务器下载Excel文件 JSP代码: try{ String fi

我有一个简单的JSP页面,其中包含两个按钮:查看和导出。当点击查看按钮时,我将从数据库中获取数据,将副本保存到会话中,并将HTML代码写入带有数据的标签中。稍后,当用户单击“导出”时,我希望在服务器中生成一个excel文件(包含来自会话的数据),并将其下载到客户端

Excel文件已在服务器端成功创建。我正在使用客户端的AJAX请求从服务器下载Excel文件

JSP代码:

 try{                           

                    String filepath=ExportToExcel(session.getAttribute("InvestmentDetails"));

                    //Setting file to download
                    response.setContentType( "application/x-download");

                    response.setHeader("Content-Disposition","attachment; filename=\"SIPInvestment_531.xls\"");                                                                             
                    response.setStatus(200);
                    InputStream in = null;
                    ServletOutputStream outs = response.getOutputStream();                        

                    try {                            
                        File filetodownload=new File(filepath);
                        response.setContentLength(Integer.parseInt(String.valueOf(filetodownload.length())));                                
                        in = new BufferedInputStream(new FileInputStream(filetodownload));                            
                        int ch;
                        while ((ch = in.read()) != -1) {
                            outs.print((char) ch);
                        }
                    }
                    finally {
                        if (in != null) in.close(); 
                    }
                    outs.flush();
                    outs.close();                                                

                }
                catch(Exception ex){
                    str=ex.getMessage();                                          
                }
下面是Javascript:

 xmlhttp=new XMLHttpRequest();
            xmlhttp.onreadystatechange=function(){
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                    {


                    }
            }
            xmlhttp.open("POST","/SIP/rptClientInvestmentDetails.jsp?requesttype=export",false);
            xmlhttp.send();                          

请求到达JSP页面。并且毫无例外地写入响应outputstream。但并没有从浏览器中弹出下载。有什么问题吗?

Ajax应该用于元语言,而不是二进制文件

简单的

 <a href="/SIP/rptClientInvestmentDetails.jsp?requesttype=export"
    target="_blank">Export</a>

这就是你所需要的


如果您确保说出了
response.setHeader(“Content Disposition”,“attachment
),您应该按照BalusC的建议删除target属性。

我认为您可以使用location.href=“提供java类函数名"。这将在不使用ajax调用的情况下将控制权从jsp转移到java函数。

您不会得到一个异常,说明您已经开始写入响应,因为您尝试在jsp中嵌入的不适当java代码中再次写入响应?请注意,
target
属性在这里是不必要的。它甚至可能是di因为这种类型的下载内容类型会强制进行另存为对话,所以最终用户将保留一个完全空白的选项卡。由于明显的安全原因,JavaScript没有工具强制对独立检索/生成的内容进行另存为对话。@Vivek它是“可用的”,但这不是一个好主意。如果你想把整个生命都花在一个名为“excel for javascript”的项目上,但吃黄色的意大利面更明智。@BalusC我的一些客户喜欢在单独的窗口中显示错误消息。我不知道为什么。:dp请列出实现这种效果所需的框架。