使用angularjs向浏览器发送servlet响应(下载功能)

时间:2015-04-10 05:17:57

标签: javascript html css angularjs

我有一个NG-GRID,其中填充了数据。 用户选择一些行并尝试导出它。在导出的报告中只能看到那些行。

正在进行的方法/设计是:

  1. 将选定的行值发送到服务器
  2. 调用的servlet从客户端获取行信息并处理XLS文件,并作为响应添加文件和标题的所有细节以供下载文件。
  3. 调用servlet的函数返回接收的数据。 下面是在ng-click()上调用的下载函数 下载数据servlet正在创建文件并在响应中写入文件和标题的数据。

    $ scope.download = function(){         $ scope.downloadText =“准备文件......”;         $ scope.isDownloadDisabled = TRUE;         return($ http.post('./ DownloadData',mySelections).success(                 功能(数据,状态,标题,配置)                 {                     $ scope.downloadText = “下载”;                     $ scope.isDownloadDisabled = FALSE;                     console.log(“我在这里”)                     返回数据;                 })         );     }

  4. 但我没看到的是下载的数据。虽然标题是正确的。

    以下是在服务器上执行的功能代码:

    private void processData(HttpServletRequest request, HttpServletResponse response) throws ServletException
        {
            try
            {
                Map<String, Map<String, String>> loadedData = getTableDataForRequest(request);
                if (loadedData == null || loadedData.size() == 0)
                {
                    log.error("Exception no data generated for exporting");
                    throw new ServletException();
                }
                else
                {
                    XLSDataWriter xlsDataWriter = new XLSDataWriter(loadedData);
                    String pathToGeneratedFile = getServletContext().getRealPath("resources");
                    pathToGeneratedFile = pathToGeneratedFile.substring(0, pathToGeneratedFile.indexOf("resources"));
                    pathToGeneratedFile += "generatedFiles" + File.separator;
    
                    File file = xlsDataWriter.writeDataToXls(pathToGeneratedFile);
    
                    response.setContentType("application/vnd.ms-excel");
                    response.setHeader("content-disposition", "attachment; filename=" + file.getName());
                    OutputStream outStream = response.getOutputStream();
                    byte[] buffer = new byte[4096];
                    int bytesRead = -1;
                    FileInputStream inStream = new FileInputStream(file);
                    while ((bytesRead = inStream.read(buffer)) != -1)
                    {
                        outStream.write(buffer, 0, bytesRead);
                    }
                    inStream.close();
                    log.info("Full file path : " + file.getAbsolutePath());
                }
            }
            catch (Exception ex)
            {
                log.error("Exception while fetching the download data", ex);
            }
        }
    

    请帮助我已经被困在这里很多天了。

1 个答案:

答案 0 :(得分:0)

好的,这就是我为解决问题所做的工作。

在angular。函数内创建了一个链接。

将href属性分配给servlet,该servlet通过传递myselection的变量来返回附件文件。

执行点击动作。

$scope.downloadText="Downloading...";
        $scope.isDownloadDisabled=true;
        var servletPath = './DownloadData?JSON='+JSON.stringify(mySelections);
        var downloadLink = angular.element('<a></a>');
        downloadLink.attr('href',servletPath);
        downloadLink[0].click();
        $scope.downloadText="Download";
        $scope.isDownloadDisabled=false;