2014-02-12 14 views
25

Ich habe die letzten Tage an this problem gearbeitet. Ohne Glück beim Versuch, den Stream auf <embed src> anzuzeigen, habe ich gerade versucht, es in einem neuen Fenster anzuzeigen.PDF Blob - Popup-Fenster zeigt keinen Inhalt

Das neue Fenster zeigt PDF Kontrollen nurenter image description here)

Jede Idee, warum der Inhalt der pdf zeigt nicht?

Code:

$http.post('/fetchBlobURL',{myParams}).success(function (data) { 
    var file = new Blob([data], {type: 'application/pdf'}); 
    var fileURL = URL.createObjectURL(file); 
    window.open(fileURL); 
}); 
+0

Verwenden Sie $ Fenster (mit einem Dollarzeichen). – naXa

+0

Siehe meine Frage und Antwort hier: http://stackoverflow.com/questions/41390623/post-complex-data-and-open-generated-pdf-in-new-window – Groppe

Antwort

69

Sie müssen die responseType-arraybuffer setzen, wenn Sie eine blob aus Ihrer Antwortdaten erstellen möchten:

$http.post('/fetchBlobURL',{myParams}, {responseType: 'arraybuffer'}) 
    .success(function (data) { 
     var file = new Blob([data], {type: 'application/pdf'}); 
     var fileURL = URL.createObjectURL(file); 
     window.open(fileURL); 
}); 

weitere Informationen: Sending_and_Receiving_Binary_Data

+0

Funktioniert nicht für mich. Wenn Sie die URL im Browserfenster eingeben, funktioniert sie, aber nicht über die Methode $ http.post. Gibt es noch etwas anderes zu beachten? Sicherheitseinstellungen? Browsertyp und Version? – zszep

+0

Es funktioniert jetzt. Scheint, dass der arrayBuffer ab v.1.1 in angularjs implementiert wurde. Ich hatte v.1.08. Beim Upgrade von angularjs hat alles gut funktioniert. – zszep

+0

Das funktioniert fast für mich. Ich muss dasselbe tun, aber ich muss eine benutzerfreundliche URL oder einen fileName einstellen. Die UUID, die der Browser setzt, funktioniert nicht für mich. Weißt du, ob es eine Möglichkeit gibt, ein PDF in einem neuen Tab zu öffnen und den Dateinamen in der URL zu setzen? Vielen Dank! – elfrasco

6

Ich benutze AngularJS v1.3.4

HTML:

<button ng-click="downloadPdf()" class="btn btn-primary">download PDF</button> 

JS Controller:

'use strict'; 
angular.module('xxxxxxxxApp') 
    .controller('MathController', function ($scope, MathServicePDF) { 
     $scope.downloadPdf = function() { 
      var fileName = "test.pdf"; 
      var a = document.createElement("a"); 
      document.body.appendChild(a); 
      MathServicePDF.downloadPdf().then(function (result) { 
       var file = new Blob([result.data], {type: 'application/pdf'}); 
       var fileURL = window.URL.createObjectURL(file); 
       a.href = fileURL; 
       a.download = fileName; 
       a.click(); 
      }); 
     }; 
}); 

JS Dienstleistungen:

angular.module('xxxxxxxxApp') 
    .factory('MathServicePDF', function ($http) { 
     return { 
      downloadPdf: function() { 
      return $http.get('api/downloadPDF', { responseType: 'arraybuffer' }).then(function (response) { 
       return response; 
      }); 
     } 
    }; 
}); 

Java REST Web S ervice - Spring MVC:

@RequestMapping(value = "/downloadPDF", method = RequestMethod.GET, produces = "application/pdf") 
    public ResponseEntity<byte[]> getPDF() { 
     FileInputStream fileStream; 
     try { 
      fileStream = new FileInputStream(new File("C:\\xxxxx\\xxxxxx\\test.pdf")); 
      byte[] contents = IOUtils.toByteArray(fileStream); 
      HttpHeaders headers = new HttpHeaders(); 
      headers.setContentType(MediaType.parseMediaType("application/pdf")); 
      String filename = "test.pdf"; 
      headers.setContentDispositionFormData(filename, filename); 
      ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(contents, headers, HttpStatus.OK); 
      return response; 
     } catch (FileNotFoundException e) { 
      System.err.println(e); 
     } catch (IOException e) { 
      System.err.println(e); 
     } 
     return null; 
    } 
7

Wenn Sie setzen { responseType: 'blob' }, keine Notwendigkeit Blob auf eigene Faust zu erstellen. Sie können einfach urlbasiert mit Antwort-Inhalt erstellen:

$http({ 
    url: "...", 
    method: "POST", 
    responseType: "blob" 
}).then(function(response) { 
    var fileURL = URL.createObjectURL(response.data); 
    window.open(fileURL); 
});