日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC-10循序渐进之文件下载

發布時間:2025/3/21 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC-10循序渐进之文件下载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 概述
  • 文件下載概覽
  • 隱藏資源
  • 防止交叉引用
  • 源碼

概述

像靜態資源,我們在瀏覽器中打開正確的URL即可下載,只要該資源不是放在WEB-INF目錄下,Servlet/JSP容器就會將該資源發送到瀏覽器。 然而有的時候靜態資源是保存在應用程序目錄外或者存在數據庫中,或者有的時候需要控制它的訪問權限,防止其他網站交叉引用它。 如果出現上述任意一種情況,都必須通過編程來發送資源。


文件下載概覽

為了將像文件這樣的資源發送到瀏覽器,需要在控制器中完成以下工作

1. 隊請求處理方法使用void返回類型,并在方法中添加HttpServletRespinse參數

2. 將響應的內容設置為文件的內容類型。 Content-Type標題在某個實體的body中定義數據的類型,并包含沒提類型和子類型標示符。如果不清楚內容類型,并且希望瀏覽器始終顯示Save As(另存為)對話框,則將它設置為APPLICATION/OCTETPSTREAM ,不區分大小寫

3. 添加一個名為Content-Dispositionde HTTP響應標題,并賦值attachment;filename=fileName.這里的fileName是默認文件名,應該出現在File Download對話框中,它通常與文件名同名,但是也并非一定如此

下面的代碼是將一個文件發送到瀏覽器

FileInputStream fis = new FileInputStream(); BufferedInputStream bis = new BufferedInputStream(fis); byte[] bytes = new byte[bis.available()]; response.setContentType(contentType); OutputStream os = response.getOutputStream(); bis.read(bytes); os.write(bytes);

為了通過編程將一個文件發送到瀏覽器,首先要讀取該文件作為FileInputStream,并將內容加載到一個字節數組。 隨后,獲取HttpServletResponse的OutputStream,并調用其write方法傳入字節數組。


隱藏資源

該示例演示如何向瀏覽器發送文件,由ResourceController類處理用戶登錄請求,并將WEB-INF/data目錄下的artisan.pdf發送給瀏覽器。因為文件放到了WEB-INF目錄下,所以不能夠直接訪問,只有得到授權的用戶才能看到,如果未登錄,返回登錄頁面。

ResourceController, 這里模擬下用戶登錄,只有當用戶的HttpSession中包含一個loggedIn屬性時,表明登錄成功。

package com.artisan.controller;import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.OutputStream;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping;import com.artisan.domain.Login;@Controller public class ResourceController {@RequestMapping(value = "/login")public String login(@ModelAttribute Login login, HttpSession httpSession, Model model) {model.addAttribute("login", new Login());if ("artisan".equals(login.getUserName()) && "artisan123".equals(login.getPassword())) {httpSession.setAttribute("loggedIn", Boolean.TRUE);return "Main";} else {return "LoginForm";}}@RequestMapping(value = "/resource_download")public String downLoadResource(HttpSession session, HttpServletRequest request, HttpServletResponse response) {if (session == null && session.getAttribute("loggedIn") == null) {return "LoginForm";}String dataDirectory = request.getServletContext().getRealPath("/WEB-INF/data");File file = new File(dataDirectory, "artisan.pdf");if (file.exists()) {response.setContentType("application/pdf");response.addHeader("Content-Disposition", "attachment; filename=artisan.pdf");byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;// JDK7 以前的寫法// try {// fis = new FileInputStream(file);// bis = new BufferedInputStream(fis);// OutputStream os = response.getOutputStream();// int i = bis.read(buffer);// while (i != -1) {// os.write(buffer, 0, i);// i = bis.read(buffer);// }// } catch (IOException ex) {// // do something,// // probably forward to an Error page// } finally {// if (bis != null) {// try {// bis.close();// } catch (IOException e) {// }// }// if (fis != null) {// try {// fis.close();// } catch (IOException e) {// }// }// }//// Java 7, use try-with-resources,自動釋放資源try (OutputStream os = response.getOutputStream();) {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (Exception e) {// do something, // probably forward to an Error page}}return null;} }

login方法,將用戶帶到登錄表單頁面

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE HTML> <html> <head> <title>Login</title> <style type="text/css">@import url("<c:url value="/css/main.css"/>");</style> </head> <body> <div id="global"> <form:form commandName="login" action="login" method="post"><fieldset><legend>Login</legend><p><label for="userName">User Name: </label><form:input id="userName" path="userName" cssErrorClass="error"/></p><p><label for="password">Password: </label><form:password id="password" path="password" cssErrorClass="error"/></p><p id="buttons"><input id="reset" type="reset" tabindex="4"><input id="submit" type="submit" tabindex="5" value="Login"></p></fieldset> </form:form> </div> </body> </html>

用戶名和密碼在login方法中使用硬編碼的方式模擬用戶登錄,成功后跳轉到Main.jsp頁面,該頁面包含一個超鏈接,點擊下載文件。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML> <html> <head> <title>Download Page</title> <style type="text/css">@import url("<c:url value="/css/main.css"/>");</style> </head> <body> <div id="global"><h4>Please click the link below.</h4><p><a href="resource_download">Download</a></p> </div> </body> </html>

測試

點擊鏈接

查看下載的文件


防止交叉引用

為了防止他人引用我們網站的資源,可以通過編程的方式,只有當請求的報頭referer標題中包含你的域名時才發出資源,當然了這種方式也不能完全阻止。

該示例中,ImageController類中,只有referer標題不為空時,才將圖片發送給瀏覽器

package com.artisan.controller;import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;@Controller public class ImageController {@RequestMapping("/imageList")public String getImageList(){return "Image"; }@RequestMapping(value = "/image_get/{id}", method = RequestMethod.GET)public void getImage(@PathVariable String id, HttpServletRequest request, HttpServletResponse response,@RequestHeader String referer) {// 判斷請求頭中的Refererif (referer != null) {String imageDirectory = request.getServletContext().getRealPath("/WEB-INF/image");File file = new File(imageDirectory, id + ".jpg");if (file.exists()) {response.setContentType("image/jpg");byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;// if you're using Java 7, use try-with-resourcestry {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}} catch (IOException ex) {// do something here} finally {if (bis != null) {try {bis.close();} catch (IOException e) {}}if (fis != null) {try {fis.close();} catch (IOException e) {}}}}}} }

前臺頁面

<!DOCTYPE HTML> <html> <head> <title>Images</title> </head> <body> <img src="image_get/1"/> <img src="image_get/2"/> <img src="image_get/3"/> <img src="image_get/4"/> <img src="image_get/5"/> <img src="image_get/6"/> <img src="image_get/7"/> <img src="image_get/8"/> <img src="image_get/9"/> <img src="image_get/10"/> </body> </html>

測試:


源碼

代碼已提交到github

https://github.com/yangshangwei/SpringMvcTutorialArtisan

總結

以上是生活随笔為你收集整理的Spring MVC-10循序渐进之文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲午夜18毛片在线看 | 99久久精品一区二区 | 日本一区二区欧美 | 国产伦精品一区二区三区免.费 | 男人的天堂一区 | 久久精品视频2 | 毛片小视频 | 亚洲一区二区三区在线看 | 日本亲近相奷中文字幕 | 亚洲最大福利 | 秒拍福利视频 | 未满十八18禁止免费无码网站 | 一区二区国产精品 | 8x8ⅹ国产精品一区二区二区 | 91免费官网 | 超碰av在线播放 | 9.1成人免费看片 | 欧美在线观看视频 | 国产精品久久欧美久久一区 | 高清一区二区在线 | 这里只有精品免费视频 | 在线国产中文字幕 | 少妇一级淫免费放 | 女同性恋一区二区三区 | 欧美精品在线免费观看 | 欧美性猛交xxxx黑人 | 在线天堂v | www.黄色大片 | 91久久久久久久久久久久 | 一区二区在线观看av | 91视频综合 | www.色婷婷 | 色片在线播放 | 国产美女视频免费观看下载软件 | 在线免费一区二区 | 久久久久国产一区二区 | 99爱国产 | 影音先锋中文字幕在线播放 | 久久国内免费视频 | 欧美老肥熟 | aaaa黄色 | 深夜视频免费在线观看 | 91亚洲一区| 艳妇臀荡乳欲伦交换gif | 夜夜夜夜夜操 | 美女三级黄色片 | 88福利视频 | 性久久久久久久久 | 色呦呦在线看 | 久久亚洲av成人无码国产电影 | 一区二区国产精品 | 欧美高清久久 | 97伦伦午夜电影理伦片 | 日本久久久久久久久久 | 四虎网址在线观看 | 色播放| 91亚瑟视频 | 午夜淫片 | 国产精品久久久久久久专区 | 国产一区二区三区视频在线观看 | 亚洲wwww | 小伸进喷水网站 | 超碰2021| 黄色理论片 | 精品免费视频 | 日韩 欧美| 九九热视频免费观看 | 国产又粗又猛又爽又黄91精品 | 日韩欧美91 | 成年人激情网站 | 午夜视频在线瓜伦 | 久久亚洲精品视频 | 久久精品国产亚洲AV黑人 | 欧美va亚洲va | 高清不卡一区二区三区 | 男人和女人日b视频 | 国产主播99 | 欧美一区二区三区成人 | 日本一区二区三区免费观看 | 91播放在线 | 尤物在线| 大学生三级中国dvd 日韩欧美一区二区区 | 国产一区在线视频 | 欧美一区二区三区公司 | 91网国产| 亚洲综合色一区 | 亚洲一级一级 | 精品一区亚洲 | 中文理论片 | 天天干天天操天天舔 | 国产日韩精品一区二区 | 操人视频网站 | 天堂在线中文资源 | 欧美一级特黄aa大片 | 国产做爰免费观看 | 欧美激情精品久久久久久 | 女的高潮流时喷水图片大全 | 亚洲蜜臀av乱码久久精品蜜桃 | 免费精品在线视频 |