我目前正在开发一个AngularJS项目,其中包含用PHP编写的服务器后端。前端和后端完全以JSON进行通信,但是,有一种导出方案,其中服务器的输出不是JSON编码,而是(文本或二进制)文件。
Web应用程序不能仅将客户端的浏览器重定向到下载URL,因为服务器需要HTTP请求中的自定义标头(即API密钥)来提供文件。因此,我在AngularJS中使用$ http来启动AJAX请求。以下是发生的事情:
服务器端的文件生成(使用带有Slim框架的PHP):
$export = $this->model->export_cards($project_key);
$this->app->response()->status(200);
$this->app->response()->header("Content-Type", "text/plain");
$this->app->response()->header("Content-Disposition", "attachment; filename=\"export.txt\"");
$this->app->response()->header("Last-Modified", date("r");
$this->app->response()->header("Cache-Control", "cache, must-revalidate");
$this->app->response()->body($export);
$this->app->stop();
这是客户端(到目前为止)发生的事情:
$http({
method: "get",
url: "/server/projects/cards/export_cards/" + $scope.key,
headers: {
"X-API-Key": session_service.get("api_key")
}
}).then(
function(response)
{
// Success, data received
var data = response.data; // This variable contains the file contents (might be plain text, or even binary)
// How do I get the browser to offer a file download dialog here?
},
function(response)
{
// Error handling
}
);
我成功收到AngularJS前端的文件内容,并将它们存储在变量data
中。如何让浏览器显示文件下载对话框?
该解决方案必须适用于Internet Explorer 10+以及相当新版本的Firefox,Chrome和Safari(仅限桌面版本)。
实现这一目标的最佳方法是什么?
感谢您的帮助,如果我需要提供任何其他信息,请与我们联系。
彼得
答案 0 :(得分:0)
我不确定这是可能的。
你可以:
直接提供API密钥,例如:
location.href = "/server/projects/cards/export_cards/" + $scope.key + '?api_key=' + session_service.get("api_key");
或者,让您的API返回文件下载的临时,过期时间的URL,然后使用location.href访问此URL。