以前的思路一直是彈出一個框問用戶想要存放文件的位置,而後我再生成個文件放到那。然而我這個想法並無成功。
前端
點擊連接來下載文件的方式很簡便,後臺把文件流輸出來,經過瀏覽器實現下載功能,包括詢問位置與文件存放,大多數瀏覽器會配置一個固定位置,不必定每次都問。java
前端就很是簡單了,一個<a>標籤,href=「後臺方法地址」,若是你的需求不能直接用超連接方式,能夠在js裏寫 window.location.href =「後臺方法地址」。ajax
這樣跳轉到後臺方法後瀏覽器
String filePath = this.getClass().getClassLoader().getResource("").toURI().getPath() + "/exportPdf.pdf"; //文件在項目中的路徑 File outfile = new File(filePath); String filename = outfile.getName();// 獲取文件名稱 InputStream fis = new BufferedInputStream(new FileInputStream( filePath)); byte[] buffer = new byte[fis.available()]; fis.read(buffer); //讀取文件流 fis.close(); response.reset(); //重置結果集 response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.replaceAll(" ", "").getBytes("utf-8"), "iso8859-1")); //返回頭 文件名 response.addHeader("Content-Length", "" + outfile.length()); //返回頭 文件大小 response.setContentType("application/octet-stream"); //設置數據種類 //獲取返回體輸出權 OutputStream os = new BufferedOutputStream(response.getOutputStream()); os.write(buffer); // 輸出文件 os.flush(); os.close();
瀏覽器會直接識別這種形式的文件輸出,彈出對話框。app
注意此方法必定要用連接方式調後臺,使用ajax和XMLHttpRequest方式都是不行的,這樣返回的文件流會返回到方法的回調函數中,固然若是你想在js中獲取文件,這樣也行。函數