2016-09-23 61 views
0

在我的AngularJS網站中,我想加載.pdf文檔並在新的瀏覽器選項卡中顯示它們。下面的代碼可以工作,但有些東西會打擾我:AngularJS在新選項卡中打開PDF並更改文件名/ URL

createdObjectURL被設置爲文檔和瀏覽器選項卡的標題。這意味着我的文檔總是被標題爲01d9bdca-9af2-43f0-a83f-f36fd82fd72,這不太合適。可見的URL也不好。而不是blob:http://localhost:8080/01d9bdca-9af2-43f0-a83f-f36fd82fd72f最好是在service.js中調用我所調用的URL。

我試圖以處理HttpHeaders文件名,但沒有任何效果可言:(

另一個奇怪的事情:如果我不指定{responseType: "arraybuffer"},正確顯示PDF格式的標題,但沒有。沒有內容,該文件是空的。

如何更改文件名和/或網址,將不勝感激任何幫助,謝謝。

JS控制器

DocumentService.getDocument().then(function(response) { 
    $window.open(response, '_blank'); 
}); 

JS服務

return { 
    getDocument : function() { 
    return $http.get("document", {responseType: "arraybuffer"}) 
     .then(function(response) { 
     var file = new Blob([response.data], {type: "application/pdf"}); 
     var fileURL = URL.createObjectURL(file); 
     return fileURL; 
     } 
    } 
} 

Spring MVC的REST的服務

@RequestMapping(value = "/document", method = RequestMethod.GET) 
public ResponseEntity<byte[]> getDocument(){ 
    try { 
    File file = new File("C:\\pathToFile.pdf"); 
    byte[] fileContent = new byte[(int) file.lenth()]; 

    HttpHeaders heraders = new HttpHeaders(); 
    headers.setContentType(MediaType.parseMediaType("application/pdf")); 
    String filename = "NameOfFile.pdf"; 
    headers.setContentDispositionFormData(filename, filename); //doesn't change anything 

    fileContent = File.readAllBytes(file.toPath()); 

    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(fileContent, headers, HttpStatus.OK); 

    return response; 
    } catch (FileNotFoundException e) { 
    System.err.println("File not found " + e); 
    } catch (IOException e) { 
    System.err.pringln("Error while reading file " + e); 
    } 
} 

短版: 當PDF文件在加載爲字節數組並顯示其新的瀏覽器選項卡與AngularJS $ window指令:是否有很好的可能性來更改文件名和URL?

+1

難道你不能只打開一個新的選項卡與url的資源返回字節數組?就像'$ window.open('localhost:xxx/api/document','_blank');' – Amygdaloideum

+0

謝謝@DanielBornstrand,這個工程。窗口標題現在只是「文檔」,但文檔標題(如果文檔被下載)是我指定的標題。這不是100%完美,但比以前更好,也更少的代碼:) – Freddy

+0

我將它作爲答案張貼! :) – Amygdaloideum

回答

3

打開一個新的選項卡,其URL返回字節數組的資源!就像:

$window.open('localhost:xxx/api/document', '_blank');