最新国产好看的视频,伊人天堂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來進(jìn)行HTTP下載的方法,接下來就詳細(xì)來看Java Web應(yīng)用程序?qū)崿F(xiàn)基礎(chǔ)的文件下載功能的實(shí)例講解

基礎(chǔ)思路:
之前的思路一直是彈出一個(gè)框問用戶想要存放文件的位置,然后我再生成個(gè)文件放到那。然而我這個(gè)想法并沒有成功。
點(diǎn)擊鏈接來下載文件的方式很簡(jiǎn)便,后臺(tái)把文件流輸出來,通過瀏覽器實(shí)現(xiàn)下載功能,包括詢問位置與文件存放,大多數(shù)瀏覽器會(huì)配置一個(gè)固定位置,不一定每次都問。
前端就非常簡(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 頭 用于說明來訪者來自哪里
 String referer = request.getHeader("referer");
 if(referer==null || !referer.startsWith("http://localhost")) {
  // 是盜鏈者
  response.sendRedirect("/day06/index.jsp");
  return ;
 }
 
 
 // 解決response中文亂碼問題
 response.setContentType("text/html;charset=utf-8"); // 設(shè)置消息體的編碼
 
 
 // 通過 http 協(xié)議 發(fā)送的http響應(yīng)消息頭 不能出現(xiàn)中文 中文必須要經(jīng)過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)景,通過代碼介紹的非常詳細(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語言編寫一個(gè)跳表,需要的可以參考一下
    2022-05-05
  • 詳解SpringBoot中添加@ResponseBody注解會(huì)發(fā)生什么

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

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

    SpringBoot中的@ConfigurationProperties注解解析

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

    JVM 命令行工具的使用

    造成Java應(yīng)用出現(xià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ī)硪黄贘DBC封裝的BaseDao(實(shí)例代碼)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    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ù)庫連接方法梳理

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

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

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

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

最新評(píng)論

景德镇市| 遂平县| 彭山县| 灵丘县| 新乡县| 北碚区| 静乐县| 阜新| 共和县| 马关县| 松桃| 江津市| 宁强县| 沽源县| 洮南市| 昌邑市| 新巴尔虎右旗| 邵阳县| 景德镇市| 攀枝花市| 曲靖市| 印江| 依安县| 武陟县| 仙游县| 长治市| 台北市| 黄浦区| 六枝特区| 和林格尔县| 武清区| 二手房| 太康县| 明光市| 陈巴尔虎旗| 石城县| 麻城市| 桦川县| 兴化市| 浦北县| 栾川县|