我有一個提供文件的Java Web應用程序:
@RequestMapping(value = "/pdf/download", method = RequestMethod.GET)public void download( HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "id", required = true) Long id) throws IOException { File pdfFile = pdfFileManager.getFromId(id); response.setContentType("application/pdf"); response.addHeader("Content-Disposition", "attachment; filename=download"); response.setContentLength((int) pdfFile.length()); FileInputStream fileInputStream = null; OutputStream responseOutputStream = null; try { fileInputStream = new FileInputStream(pdfFile); responseOutputStream = response.getOutputStream(); int bytes; while ((bytes = fileInputStream.read()) != -1) { responseOutputStream.write(bytes); } responseOutputStream.flush(); } finally { fileInputStream.close(); responseOutputStream.close(); }}
我在客戶端檢索文件,base64使用FileReader對其進行編碼:
$.ajax({ url: "/pdf/download?id=" id, dataType: "application/pdf", processData: false}).always(function(response) { if(response.status && response.status === 200) { savePdf(response.responseText, "download_" id); } }); function savePdf(pdf, key) { var blob = new Blob([pdf], {type: "application/pdf"}); var fileReader = new FileReader(); fileReader.onload = function (evt) { var result = evt.target.result; try { localStorage.setItem(key, result); } catch (e) { console.log("Storage failed: " e); } }; fileReader.readAsDataURL(blob);}
問題是本地存儲中保存的值不正確.編碼數(shù)據(jù)與我使用this snip上傳PDF時得到的數(shù)據(jù)不同.我不知道問題是我如何在客戶端中提供文件或編碼過程.
存儲的值是這樣的
data:application/pdf;base64,JVBERi0xLjQKJe /ve /ve /ve /vQoxIDAgb...
代替
data:application/pdf;base64,JVBERi0xLjQKJeHp69MKMSAwIG9iago8PC9Ue...
解決方法:
解決了將請求的響應類型設置為blob的問題:
var xhr = new XMLHttpRequest(); xhr.open("GET", "/pdf/download?id=" id); xhr.responseType = "blob";xhr.onload = function() { if(xhr.status && xhr.status === 200) { savePdf(xhr.response, "download_" id); } }xhr.send();function savePdf(pdf, key) { var fileReader = new FileReader(); fileReader.onload = function (evt) { var result = evt.target.result; try { localStorage.setItem(key, result); } catch (e) { console.log("Storage failed: " e); } }; fileReader.readAsDataURL(pdf);}
來源:https://www.icode9.com/content-1-275951.html