最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java Web應(yīng)用程序?qū)崿F(xiàn)基礎(chǔ)的文件下載功能的實(shí)例講解

 更新時(shí)間:2016年05月31日 15:58:09   作者:longshengguoji  
這里我們演示了Servelet驅(qū)動(dòng)Tomcat來(lái)進(jìn)行HTTP下載的方法,接下來(lái)就詳細(xì)來(lái)看Java Web應(yīng)用程序?qū)崿F(xiàn)基礎(chǔ)的文件下載功能的實(shí)例講解

基礎(chǔ)思路:
之前的思路一直是彈出一個(gè)框問(wèn)用戶想要存放文件的位置,然后我再生成個(gè)文件放到那。然而我這個(gè)想法并沒(méi)有成功。
點(diǎn)擊鏈接來(lái)下載文件的方式很簡(jiǎn)便,后臺(tái)把文件流輸出來(lái),通過(guò)瀏覽器實(shí)現(xiàn)下載功能,包括詢問(wèn)位置與文件存放,大多數(shù)瀏覽器會(huì)配置一個(gè)固定位置,不一定每次都問(wèn)。
前端就非常簡(jiǎn)單了,一個(gè)<a>標(biāo)簽,href=“后臺(tái)方法地址”,如果你的需求不能直接用超鏈接方式,可以在js里寫

window.location.href =“后臺(tái)方法地址"。

這樣跳轉(zhuǎn)到后臺(tái)方法后

String filePath = this.getClass().getClassLoader().getResource("").toURI().getPath()
     + "/exportPdf.pdf"; //文件在項(xiàng)目中的路徑
  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(); //重置結(jié)果集
  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"); //設(shè)置數(shù)據(jù)種類
  //獲取返回體輸出權(quán)
  OutputStream os = new BufferedOutputStream(response.getOutputStream()); 
  os.write(buffer); // 輸出文件
  os.flush();
  os.close();

瀏覽器會(huì)直接識(shí)別這種形式的文件輸出,彈出對(duì)話框。
注意此方法一定要用鏈接方式調(diào)后臺(tái),使用ajax和XMLHttpRequest方式都是不行的,這樣返回的文件流會(huì)返回到方法的回調(diào)函數(shù)中,當(dāng)然如果你想在js中獲取文件,這樣也行。


實(shí)例

package cn.itcast.day06.web.servlet;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
 
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class DownloadServlet extends HttpServlet {
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 
 // 實(shí)現(xiàn)防盜鏈功能
 // 獲得 referer 頭 用于說(shuō)明來(lái)訪者來(lái)自哪里
 String referer = request.getHeader("referer");
 if(referer==null || !referer.startsWith("http://localhost")) {
  // 是盜鏈者
  response.sendRedirect("/day06/index.jsp");
  return ;
 }
 
 
 // 解決response中文亂碼問(wèn)題
 response.setContentType("text/html;charset=utf-8"); // 設(shè)置消息體的編碼
 
 
 // 通過(guò) http 協(xié)議 發(fā)送的http響應(yīng)消息頭 不能出現(xiàn)中文 中文必須要經(jīng)過(guò)url編碼
 String filename = URLEncoder.encode("美女.jpg", "utf-8");
 
 // 通知瀏覽器以下載的方式讀取資源
 response.setHeader("content-disposition", "attachment;filename="+filename);
 
 // 讀取圖片數(shù)據(jù) 發(fā)給ie瀏覽器
 String webPath = "/download/美女.jpg"; // 相當(dāng)于當(dāng)前web應(yīng)用的path
 
 ServletContext servletContext = super.getServletContext();
 
 InputStream in = servletContext.getResourceAsStream(webPath);
 
 
 OutputStream out = response.getOutputStream();
 
 
 int len;
 byte[] buffer = new byte[1024];
 while((len=in.read(buffer))!=-1)
  out.write(buffer, 0, len);
 
 }
 
 public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException {
 doGet(request, response);
 }
 
}

相關(guān)文章

  • Java中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法舉例詳解

    Java中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中實(shí)現(xiàn)定時(shí)任務(wù)的兩種方法,文中總結(jié)了各種實(shí)現(xiàn)方式的優(yōu)缺點(diǎn),并給出了推薦的使用場(chǎng)景,通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • Java實(shí)現(xiàn)跳躍表的示例詳解

    Java實(shí)現(xiàn)跳躍表的示例詳解

    跳表全稱叫做跳躍表,簡(jiǎn)稱跳表,是一個(gè)隨機(jī)化的數(shù)據(jù)結(jié)構(gòu),實(shí)質(zhì)就是一種可以進(jìn)行二分查找的有序鏈表。本文將利用Java語(yǔ)言編寫一個(gè)跳表,需要的可以參考一下
    2022-05-05
  • 詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么

    詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么

    這篇文章主要介紹了詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • SpringBoot中的@ConfigurationProperties注解解析

    SpringBoot中的@ConfigurationProperties注解解析

    這篇文章主要介紹了SpringBoot中的@ConfigurationProperties注解解析,Spring源碼中大量使用了ConfigurationProperties注解,通過(guò)與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置,該注解可以放在類上,也可以放在方法上,需要的朋友可以參考下
    2023-11-11
  • JVM 命令行工具的使用

    JVM 命令行工具的使用

    造成Java應(yīng)用出現(xiàn)性能問(wèn)題的因素非常多,想要定位這些問(wèn)題,一款優(yōu)秀的性能診斷工具必不可少,本文主要介紹了JVM 命令行工具的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • Java實(shí)現(xiàn)HDFS文件上傳下載

    Java實(shí)現(xiàn)HDFS文件上傳下載

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)HDFS文件上傳下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于JDBC封裝的BaseDao(實(shí)例代碼)

    基于JDBC封裝的BaseDao(實(shí)例代碼)

    下面小編就為大家?guī)?lái)一篇基于JDBC封裝的BaseDao(實(shí)例代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    SpringBoot啟動(dòng)流程入口參數(shù)創(chuàng)建對(duì)象源碼分析

    這篇文章主要為大家介紹了SpringBoot啟動(dòng)流程入口參數(shù)研究及創(chuàng)建對(duì)象源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java MongoDB數(shù)據(jù)庫(kù)連接方法梳理

    Java MongoDB數(shù)據(jù)庫(kù)連接方法梳理

    MongoDB作為一種介于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)之間的產(chǎn)品,它可以提供可擴(kuò)展的高性能的數(shù)據(jù)存儲(chǔ)解決方案,近些年來(lái)受到了開(kāi)發(fā)者的喜愛(ài)
    2022-08-08
  • Java無(wú)限級(jí)樹(shù)(遞歸)超實(shí)用案例

    Java無(wú)限級(jí)樹(shù)(遞歸)超實(shí)用案例

    下面小編就為大家?guī)?lái)一篇Java無(wú)限級(jí)樹(shù)(遞歸)超實(shí)用案例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11

最新評(píng)論

漳平市| 北辰区| 凤凰县| 开江县| 汝州市| 突泉县| 盐源县| 江阴市| 东山县| 深水埗区| 德惠市| 宁津县| 江门市| 株洲市| 惠安县| 东宁县| 都江堰市| 西青区| 泰安市| 碌曲县| 海伦市| 惠水县| 镇沅| 杭锦旗| 永川市| 廉江市| 金川县| 金堂县| 玉林市| 罗田县| 无棣县| 阿克陶县| 库车县| 比如县| 清远市| 洪泽县| 嘉义市| 桃源县| 甘南县| 剑阁县| 乌苏市|