download csv file from web api in angular js

前端 未结 10 1634
[愿得一人]
[愿得一人] 2020-11-28 03:23

my API controller is returning a csv file as seen below:

    [HttpPost]
    public HttpResponseMessage GenerateCSV(FieldParameters fieldParams)
    {
                


        
相关标签:
10条回答
  • 2020-11-28 04:04

    None of those worked for me in Chrome 42...

    Instead my directive now uses this link function (base64 made it work):

      link: function(scope, element, attrs) {
        var downloadFile = function downloadFile() {
          var filename = scope.getFilename();
          var link = angular.element('<a/>');
          link.attr({
            href: 'data:attachment/csv;base64,' + encodeURI($window.btoa(scope.csv)),
            target: '_blank',
            download: filename
          })[0].click();
          $timeout(function(){
            link.remove();
          }, 50);
        };
    
        element.bind('click', function(e) {
          scope.buildCSV().then(function(csv) {
            downloadFile();
          });
          scope.$apply();
        });
      }
    
    0 讨论(0)
  • 2020-11-28 04:06

    Try it like :

    File.save(csvInput, function (content) {
        var hiddenElement = document.createElement('a');
    
        hiddenElement.href = 'data:attachment/csv,' + encodeURI(content);
        hiddenElement.target = '_blank';
        hiddenElement.download = 'myFile.csv';
        hiddenElement.click();
    });
    

    based on the most excellent answer in this question

    0 讨论(0)
  • 2020-11-28 04:12

    I used the below solution and it worked for me.

     if (window.navigator.msSaveOrOpenBlob) {
       var blob = new Blob([decodeURIComponent(encodeURI(result.data))], {
         type: "text/csv;charset=utf-8;"
       });
       navigator.msSaveBlob(blob, 'filename.csv');
     } else {
       var a = document.createElement('a');
       a.href = 'data:attachment/csv;charset=utf-8,' + encodeURI(result.data);
       a.target = '_blank';
       a.download = 'filename.csv';
       document.body.appendChild(a);
       a.click();
     }

    0 讨论(0)
  • 2020-11-28 04:15

    The last answer worked for me for a few months, then stopped recognizing the filename, as adeneo commented ...

    @Scott's answer here is working for me:

    Download file from an ASP.NET Web API method using AngularJS

    0 讨论(0)
  • 2020-11-28 04:16

    Workable solution:

    downloadCSV(data){   
     const newBlob = new Blob([decodeURIComponent(encodeURI(data))], { type: 'text/csv;charset=utf-8;' });
    
            // IE doesn't allow using a blob object directly as link href
            // instead it is necessary to use msSaveOrOpenBlob
            if (window.navigator && window.navigator.msSaveOrOpenBlob) {
              window.navigator.msSaveOrOpenBlob(newBlob);
              return;
            }
    
            // For other browsers:
            // Create a link pointing to the ObjectURL containing the blob.
            const fileData = window.URL.createObjectURL(newBlob);
    
            const link = document.createElement('a');
            link.href = fileData;
            link.download = `Usecase-Unprocessed.csv`;
            // this is necessary as link.click() does not work on the latest firefox
            link.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }));
    
            setTimeout(function () {
              // For Firefox it is necessary to delay revoking the ObjectURL
              window.URL.revokeObjectURL(fileData);
              link.remove();
            }, 5000);
      }
    
    0 讨论(0)
  • 2020-11-28 04:18

    Rather than use Ajax / XMLHttpRequest / $http to invoke your WebApi method, use an html form. That way the browser saves the file using the filename and content type information in the response headers, and you don't need to work around javascript's limitations on file handling. You might also use a GET method rather than a POST as the method returns data. Here's an example form:

    <form name="export" action="/MyController/Export" method="get" novalidate>
        <input name="id" type="id" ng-model="id" placeholder="ID" />
        <input name="fileName" type="text" ng-model="filename" placeholder="file name" required />
        <span class="error" ng-show="export.fileName.$error.required">Filename is required!</span>
        <button type="submit" ng-disabled="export.$invalid">Export</button>
    </form>
    
    0 讨论(0)
提交回复
热议问题