在web開發中,經常需要開發“下載”這一模塊,以下給出一個簡單的例子。
在服務器端,使用java開發:
01 @RequestMapping(value = "download.html", method = RequestMethod.GET) 02 public void download(String resourceid, HttpServletRequest request, HttpServletResponse response) { 03 response.setContentType("charset=UTF-8"); 04 File file = new File(path); 05 response.setHeader("Content-Disposition", "attachment; filename=a"); 06 BufferedInputStream bis = null; 07 BufferedOutputStream bos = null; 08 OutputStream fos = null; 09 InputStream fis = null; 10 try { 11 fis = new FileInputStream(file.getAbsolutePath()); 12 bis = new BufferedInputStream(fis); 13 fos = response.getOutputStream(); 14 bos = new BufferedOutputStream(fos); 15 int bytesRead = 0; 16 byte[] buffer = new byte[5 * 1024]; 17 while ((bytesRead = bis.read(buffer)) != -1) { 18 bos.write(buffer, 0, bytesRead); 19 } 20 bos.flush(); 21 }catch(E e){ 22 }finally { 23 try { 24 bis.close(); 25 bos.close(); 26 fos.close(); 27 fis.close(); 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 } 32 }當我們在前端請求這個地址時,服務器先找出文件,設置響應頭,然後通過流輸出到浏覽器端。
浏覽器在頭中發現該響應的主體是流文件,則自動會調用另存為的窗口,讓用戶保存下載。
這裡有個關鍵就是Content-Disposition這個頭屬性,Content-Disposition是MIME協議的擴展,用於指示如何讓客戶端顯示附件的文件。
它可以設置為兩個值:
inline //在線打開
attachment //作為附件下載
這裡我們設置的值為attachment,所以可以被識別為附件並下載。
上面講了如何寫服務器端,下面講前端如何請求。
前端請求有三種方式:
1.Form
1 <form action='download.html' method='post'> 2 <input type='submit'/> 3 </form>2.iframe
1 var iframe = "<iframe style='display:none' src='download.html'></iframe>" 2 body.append(iframe);當iframe被append到body中時,會自動請求下載鏈接。
3.open
1 window.open("download.html");