Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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 AngularJS-通过AJAX下载文件_Java_Javascript_Angularjs_Url_Spring Mvc - Fatal编程技术网

Java AngularJS-通过AJAX下载文件

Java AngularJS-通过AJAX下载文件,java,javascript,angularjs,url,spring-mvc,Java,Javascript,Angularjs,Url,Spring Mvc,我创建了一个angular js程序,用于从服务器下载文件 HTML代码 <a download="fullList.csv" ng-href="{{ fullListUrl }}" type="button" class="btn btn-success btn-xs exec-batch" ng-click="exportCSVBulk(batchExec)"> <span class="glyphicon glyphicon-ok"></

我创建了一个angular js程序,用于从服务器下载文件

HTML代码

<a download="fullList.csv" ng-href="{{ fullListUrl }}" type="button" class="btn btn-success btn-xs exec-batch"  ng-click="exportCSVBulk(batchExec)">
          <span class="glyphicon glyphicon-ok"></span> EXPORT AS CSV
</a>

在这里,我所做的是当用户单击
导出为CSV
链接时,函数
exportCSVBulk
启动,并从该函数设置url值(fullListUrl)。但这是一个ajax请求,因此当用户单击url链接时,响应时间会变长,导致url无法正确重定向。有可能解决这个问题吗?或者有没有其他方法可以解决这个问题?

我在通过Ajax下载.pdf、.xls、.xlsx等文件时遇到了类似的问题

事实上,我们不能通过Ajax下载文件,尽管我提出了一种通过Ajax下载文件的解决方案

您可以使用-一个jQuery文件下载插件,用于类似Ajax的功能丰富的文件下载

服务器端 我在服务器端使用Spring

@RequestMapping(value = "exportXLS", method = RequestMethod.POST, produces = APP_JSON)
@ResponseBody
public void getCSV(final HttpServletResponse response, @RequestParam(value = "empId", required = true) final String empId) throws IOException, Exception
{
    final byte[] csv = ExportXLSUtil.getFileBytes(empId); // get the file bytes
    final OutputStream output = getOutputStream(response);
    response.setHeader("Content-Disposition", "attachment; filename=documents_" + new DateTime() + ".xls");
    response.setContentType(CONTENT_TYPE);
    response.setContentLength(csv.length);
    write(output, csv);
}
客户端 在客户端,我使用AngularJS

$downloadXLS = function(id)
{
    $.fileDownload('/user/exportXLS', 
    {
        httpMethod : "POST",
        data : {
            empId : id
        }
    }).done(function(e, response)
    {
     // success
    }).fail(function(e, response)
    {
     // failure
    });
}

下载链接-我创建了一个更具角度的解决方案。如果要与服务器信息同步,服务器必须提供内容类型和内容处置,尽管您可以手动添加类型和下载属性

 vm.export = function () {
            //PopUps.showLoading()
            $http.get(Url).then(function (result) {
                //PopUps.hideLoading()
                var headers = result.headers()
                var blob = new Blob([result.data], { type: headers['content-type'] })
                var windowUrl = (window.URL || window.webkitURL)
                var downloadUrl = windowUrl.createObjectURL(blob)
                var anchor = document.createElement("a")
                anchor.href = downloadUrl
                var fileNamePattern = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
                anchor.download = fileNamePattern.exec(headers['content-disposition'])[1]
                document.body.appendChild(anchor)
                anchor.click()
                windowUrl.revokeObjectURL(blob)
            })
        }

最简单的方法是不使用AJAX发出请求。只需删除您的
ng click
属性并依靠浏览器处理下载。您是否在服务器端使用java(如Spring controller或Jersey Rest服务等)@BenFoster我在这里做了一个小更改,这里我需要参数(batchExec)从url获取内容。此外,该a href将放在表行中,因此参数将决定onclick@NidhishKrishnan是的,我正在使用SpringWebservice@AnishAntony看看我的答案。。。。
 vm.export = function () {
            //PopUps.showLoading()
            $http.get(Url).then(function (result) {
                //PopUps.hideLoading()
                var headers = result.headers()
                var blob = new Blob([result.data], { type: headers['content-type'] })
                var windowUrl = (window.URL || window.webkitURL)
                var downloadUrl = windowUrl.createObjectURL(blob)
                var anchor = document.createElement("a")
                anchor.href = downloadUrl
                var fileNamePattern = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
                anchor.download = fileNamePattern.exec(headers['content-disposition'])[1]
                document.body.appendChild(anchor)
                anchor.click()
                windowUrl.revokeObjectURL(blob)
            })
        }