Java AngularJS-通过AJAX下载文件
我创建了一个angular js程序,用于从服务器下载文件 HTML代码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"></
<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)
})
}