ボタンを押下した際にAjaxの通信でPDFをクライアントに返却し、ブラウザに表示させる、という処理を実装したいと考えています。
ただ、以下のような実装を試しましたが、期待値通りの結果になりませんでした。
検証環境
ブラウザ:chrome 76.0.3809.132
実装内容:JS上で明示的に別ウィンドウで開くように処理追加
結果:何も記載がないPDFが出力される
サーバーからの戻り値を見ると、XMLHttpRequest.responseTextにバイナリのようなデータが格納されているので、
クライアントにデータが返却されるところまでは正常に動作しているようです。
---サーバー側---
Java
1public void getPdf(@RequestParam String Code, @RequestParam String fileName, HttpServletResponse response) { 2 response.setContentType("application/pdf;charset=UTF-8"); 3 response.setHeader("Content-Disposition", "inline;filename=" + fileName); 4 5 byte[] fileData = null; 6 InputStream in = null; 7 ByteArrayOutputStream out = null; 8 OutputStream outStream = null; 9 10 try{ 11 // DBからBLOB形式のデータを取得する 12 fileData = pdfFilesTable.getfileData().getOutFile(); 13 in = new ByteArrayInputStream(fileData); 14 15 out = new ByteArrayOutputStream(); 16 int cnt; 17 while ((cnt = in.read()) != -1) { 18 out.write(cnt); 19 } 20 21 outStream = response.getOutputStream(); 22 outStream.write(out.toByteArray()); 23 24 }catch(Exception e){ 25 // log出力 26 }finally{ 27 // ストリームを閉じる 28 } 29}
---クライアント側---
Javascript
1// ボタ押下時処理 2function clickPdfButtom(propCd, fileName) { 3 var param = { 4 "Code": encodeURIComponent(Code), 5 "fileName": encodeURIComponent(fileName) 6 }; 7 getPdf(param); 8} 9 10// PDF取得処理 11function getPdf(paramData){ 12 $ajax( 13 "url/api/test1", 14 paramData, 15 null, 16 function(XMLHttpRequest, textStatus, errorThrown){ 17 // ファイル名取得 18 var disposition = XMLHttpRequest.getResponseHeader('Content-Disposition'); 19 var fileName = getFileName(disposition); 20 21 // PDFファイルをダウンロードする 22 var a = document.createElement('a'); 23 var file = new Blob([XMLHttpRequest.responseText], {type: 'application/pdf'}); 24 var url = URL.createObjectURL(file); 25 a.href= url; 26 a.download = fileName; 27 a.click(); 28 29 // 別タブで開いてPDFファイルを表示する 30 window.open(url); 31 } 32 ); 33}
※質問用に一部処理を端折って記載しているため、抜けているものがありましたら申し訳ありません。
回答1件
あなたの回答
tips
プレビュー