【问题标题】:AngularJs trigger a file download by calling a REST endpointAngularJs 通过调用 REST 端点触发文件下载
【发布时间】:2016-04-01 17:14:14
【问题描述】:

我有一个 Angular 应用程序,我想在有人点击链接时触发文件下载 (XML)。该链接实际上是在后端调用 REST 端点,然后端点返回需要下载的文件。所有这些都需要通过发送我在代码中编码的 HTTP 标头来完成。但我不太确定如何在这里做。这是我的代码:

<table class="footable table table-stripped toggle-arrow-tiny" data-page-size="8" ng-if="vm.deliveries.length!=0">
                    <thead>
                    <tr>
                        <th>Release Slug</th>
                        <th>Status</th>
                        <th>Delivery XML</th>
                        <th>Retry</th>
                    </tr>
                    </thead>
                    <tbody>
                    <tr ng-repeat="delivery in vm.deliveries" footable>
                        <td>{{delivery.slug}}</td>
                        <td>{{delivery.data.status}}</td>
                        <td align="center">
                            <a target="_self"
                                    href="{{config.apiUrl}}/deliveries/{{delivery.slug}}/ddex"
                                    tooltip="Download" ng-click="vm.getDeliveryDdex(delivery.slug)"><i class="fa fa-download"/></a>
                        </td>
                        <td><a ng-click="vm.downloadXML(delivery.slug)" ng-if="delivery.data.status=='FAILED'">
                            <i class="fa fa-repeat"></i></a></td>
                        </tbody>
                    <tfoot>
                    <tr>
                        <td colspan="5">
                            <ul class="pagination pull-right"></ul>
                        </td>
                    </tr>
                    </tfoot>
                </table>

当我点击“Delivery XML”时,我有一个 ng-click 方法“vm.downloadXML”,它在我的 JS 文件中如下所示:

function DeliveriesController(deliveriesService){
    var vm = this;
    vm.deliveries = {};

    vm.downloadXML = downloadXML;

        function downloadXML(releaseSlug){
        var url = APP_CONFIG.apiUrl + '/deliveries/' + releaseSlug + '/xml';
        var expectedMediaType = 'xml';
        var headers = {'User-Id':'abc','User-Name':'ABC XYZ', 'Workspace':'abc', 'Content-Type': 'application/xml', 'Accept': expectedMediaType};

        $http.get(url,{
            headers: headers
        }).then(function (response){
            console.log(response);
        });
    }

我不确定在代码中调用 $http.get 之后如何处理。任何建议

【问题讨论】:

  • $http.get 通话后你想做什么?
  • @georgeawg 通话后,我想下载文件本身。 http get 调用返回我需要下载的文件。

标签: javascript angularjs rest


【解决方案1】:

您可以附加一个&lt;a&gt; 标签,将文件url 设置为href 属性并触发点击下载文件。检查下面的代码,

function DeliveriesController(deliveriesService){
    var vm = this;
    vm.deliveries = {};
    vm.downloadXML = downloadXML;

    function downloadXML(releaseSlug){
    var url = APP_CONFIG.apiUrl + '/deliveries/' + releaseSlug + '/xml';
    var expectedMediaType = 'xml';
    var headers = {'User-Id':'abc','User-Name':'ABC XYZ', 'Workspace':'abc', 'Content-Type': 'application/xml', 'Accept': expectedMediaType};

    $http.get(url,{
        headers: headers
    }).then(function (response){
        console.log(response);
        //=== add <a> tag and trigger click ===
        var link = document.createElement('a');
        link.addEventListener('click', function(ev) {
        link.href = response.url; // url of the file to be downloaded
        link.download = "name";
        document.body.removeChild(link);
        }, false);
        document.body.appendChild(link);
        link.click();
    });
}

【讨论】:

  • 谢谢,在我的例子中,要下载的文件的 url 是我在上面用APP_CONFIG.apiUrl 定义的 URL。但无论如何,您的解决方案对我来说确实有意义,但我仍然无法下载它。
  • 哦该死的,我想我发现我的代码搞砸了。我的 HTML 仍然有 href 标记,尽管下载了它,但仍将其重定向到 404 页面。这工作得很好,我将把这个答案标记为正确的,以帮助我完成它。谢谢
  • 有效但有局限性。我已经用大约 2MB 的响应数据尝试了这个,但下载失败了。
猜你喜欢
  • 2014-12-23
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多