因此,这可能是一个简单的问题,但我从未做过。
我有一个Rails操作,它查询数据库并从查询结果中创建一个csv字符串。
我想将查询字符串放入一个.csv文件中,然后当用户发出与此方法相关联的http请求时,该.csv文件将下载到用户的计算机上。
我怎样才能做到这一点?
更新
该文件是从Rails发送的,但是前端的我的angular应用程序(请求csv)没有下载它。
这是我用来从Rails应用程序请求文件的角度代码
$scope.csvSubmit = function() {
var csv = $.post('http://ip_addr:3000/api/csv', { 'input': $scope.query_box });
csv.done(function(result){
//empty - after the request is sent I want the csv file to download
})
}
您可以使用该send_file
方法,将路径传递到文件作为第一个参数,如Rails文档中所示。
更新
您可以使用一个临时文件来保存CSV,如下所示:
require 'tempfile'
# automatically creates a file in /tmp
file = Tempfile.new('data.csv', 'w')
file.write('my csv')
file.close
send_file(file.path)
# remove the file from /tmp
file.unlink
更新2:AngularJS下载
有两种方法可以完成此操作:您可以添加一个隐藏的href来下载页面中的文件并单击它,或者将用户重定向到单击按钮时发送文件的Rails URL。请注意,重定向将使用url中的参数,因此根据的结构,重定向将无法正常工作query_box
。
要使用CSV向页面添加隐藏的href,请执行以下操作:
$scope.csvSubmit = function() {
var csv = $.post('http://ip_addr:3000/api/csv', { 'input': $scope.query_box });
csv.done(function(result){
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:attachment/csv,' + encodeURI(result);
hiddenElement.target = '_blank';
hiddenElement.download = 'filename.csv';
hiddenElement.click();
})
}
要使用重定向:
$scope.csvSubmit = function() {
var url = 'http://ip_addr:3000/api/csv/?' + 'input=' + encodeURI($scope.query_box);
window.location = url;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句