配置 Grails 控制器以在从服务检索数据后在浏览器中下载文件
Configure Grails controller to download file in browser after retrieving data from service
我在 Grails 中的控制器首先从远程服务中获取数据 API,返回的数据是一个字符串。然后我想在浏览器中将数据下载为 csv 文件。我在 SO 上遇到了类似的 post 并窃取了使用响应的代码,如下所示:
String exportResults = dataService.getDataFromService()
response.setHeader "Content-disposition", "attachment; filename=data_export.csv"
response.contentType = 'text/csv'
response.outputStream << exportResults.getBytes() //getBytes() not portable
response.outputStream.flush()
但是这不会触发浏览器中的任何下载window。我想知道为什么。我使用 AngularJS 向控制器发出 POST 请求并解决如下承诺(JavaScript 代码):
ExportService.exportData(some_params).then(function(data) {
$log.info('export promise resolved: ');
//window.open(data, '_blank', ''); //not working
}).catch(function(err) {
$scope.message = "failed to retrieve data from export service";
$log.error(err);
}).finally(function(complete) {
$scope.message = "Data export completed.";
});
尝试在 response.outputStream.flush()
之后添加这个,看看是否有效。
webRequest.renderView = false
您甚至可以尝试查看 here。
对于 response.contentType
,您需要将 'text/csv'
替换为 'application/octet-stream'
。内容类型 'application/octet-stream'
用于二进制文件。
我在 Grails 中的控制器首先从远程服务中获取数据 API,返回的数据是一个字符串。然后我想在浏览器中将数据下载为 csv 文件。我在 SO 上遇到了类似的 post 并窃取了使用响应的代码,如下所示:
String exportResults = dataService.getDataFromService()
response.setHeader "Content-disposition", "attachment; filename=data_export.csv"
response.contentType = 'text/csv'
response.outputStream << exportResults.getBytes() //getBytes() not portable
response.outputStream.flush()
但是这不会触发浏览器中的任何下载window。我想知道为什么。我使用 AngularJS 向控制器发出 POST 请求并解决如下承诺(JavaScript 代码):
ExportService.exportData(some_params).then(function(data) {
$log.info('export promise resolved: ');
//window.open(data, '_blank', ''); //not working
}).catch(function(err) {
$scope.message = "failed to retrieve data from export service";
$log.error(err);
}).finally(function(complete) {
$scope.message = "Data export completed.";
});
尝试在 response.outputStream.flush()
之后添加这个,看看是否有效。
webRequest.renderView = false
您甚至可以尝试查看 here。
对于 response.contentType
,您需要将 'text/csv'
替换为 'application/octet-stream'
。内容类型 'application/octet-stream'
用于二进制文件。