1. 程式人生 > >【Servlet】把檔案寫到Respond輸出流裡面供使用者下載

【Servlet】把檔案寫到Respond輸出流裡面供使用者下載

本文區分於《【Jsp】把Java寫到Respond輸出流裡面供使用者下載》(點選開啟連結)把原本該列印到控制檯的內容,直接列印到一個文字檔案txt中給使用者下載。

實際上是《【Struts2】中文檔案的下載與下載許可權的控制》(點選開啟連結)不使用三大框架,純屬使用Servlet去實現,如何把在Tomcat服務端上的檔案資源,給使用者下載。

如下圖的JavaEE目錄結構,在Tomcat上ServletDownloadTest工程的根目錄有張Chrysanthemum.jpg的圖片


但是,使用者輸入http://localhost:8080/ServletDownloadTest/download.java訪問名為download這個Servlet會出現一個下載圖片的下載提示框,如下圖:


下載之後可以開啟,而不是像img標籤那樣,直接把圖片標籤顯示在網頁。

這裡是顯示很簡單,首先由於使用了Servlet3.0的註釋方式,web.xml裡面什麼都沒有,

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	version="3.0">

</web-app>
關鍵是download.java裡面的程式碼,獲取服務端存放檔案的真實路徑之後,把這個檔案先寫到緩衝區,再把緩衝區的東西寫到respond輸出流供使用者下載。
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebServlet(name = "download", urlPatterns = { "/download" })
public class download extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String filePath = this.getServletContext().getRealPath("/");// 獲取真實路徑
		String downloadFilename = "中文是沒有問題的.jpg";// 在下載框預設顯示的檔名
		downloadFilename = URLEncoder.encode(downloadFilename, "UTF-8");
		// 對預設下載的檔名編碼。不編碼的結果就是,在客戶端下載時檔名亂碼
		File file = new File(filePath + File.separator + "Chrysanthemum.jpg");
		if (file.exists()) {
			// 寫明要下載的檔案的大小
			response.setContentLength((int) file.length());
			response.setHeader("Content-Disposition", "attachment;filename="
					+ downloadFilename);// 設定在下載框預設顯示的檔名
			response.setContentType("application/octet-stream");// 指明response的返回物件是檔案流
			// 讀出檔案到response
			// 這裡是先需要把要把檔案內容先讀到緩衝區
			// 再把緩衝區的內容寫到response的輸出流供使用者下載
			FileInputStream fileInputStream = new FileInputStream(file);
			BufferedInputStream bufferedInputStream = new BufferedInputStream(
					fileInputStream);
			byte[] b = new byte[bufferedInputStream.available()];
			bufferedInputStream.read(b);
			OutputStream outputStream = response.getOutputStream();
			outputStream.write(b);
			// 人走帶門
			bufferedInputStream.close();
			outputStream.flush();
			outputStream.close();
		}
	}
}


相關推薦

Servlet檔案Respond輸出裡面使用者下載

本文區分於《【Jsp】把Java寫到Respond輸出流裡面供使用者下載》(點選開啟連結)把原本該列印到控制檯的內容,直接列印到一個文字檔案txt中給使用者下載。 實際上是《【Struts2】中文檔案的下載與下載許可權的控制》(點選開啟連結)不使用三大框架,純屬使用Serv

C++標準檔案的輸入輸出!!!

在C++裡面的IO都是以流的形式存在的,所以在對檔案進行操作的時候也是以流的形式操作的。 主要的流:ifstream、ofstream、fstream,都包含於fstream標頭檔案裡面。 ifstream:從記憶體將檔案資料讀在硬碟 ofstream:從

Linux中記錄終端輸出到txt文字檔案

轉載: http://blog.csdn.net/tengh/article/details/41823883   一,把命令執行的結果儲存到檔案當中:用 > 把輸出轉向就可以了  例子:  $ ls > ls.txt    #或者&

C++C++ 檔案 ofstream和ifstream詳細用法

  此文貌似值得一讀:https://www.cnblogs.com/hdk1993/p/5853233.html   原文自:https://www.cnblogs.com/batman425/p/3179520.html 原文出自【位元網】,轉載請保留原文連結

學習json 檔案和 csv檔案(讀

1,json json.dumps() ---將字典轉成JSON格式 import json zhidian_json=[{ 'name':'jing1', 'age':'21', }, { 'name':'jing2', 'age':'

QtQSettings讀登錄檔、配置檔案

簡述 一般情況下,我們在開發軟體過程中,都會快取一些資訊到本地,可以使用輕量級資料庫sqlite,也可以操作登錄檔、讀寫配置檔案。 關於QSettings的使用前面已經介紹過了,比較詳細,見“更多參考”,下面介紹下QSettings常用功能-讀寫登錄檔、配置檔案。 簡述 優點 讀

原創.NET讀Excel工具Spire.Xls使用(2)Excel檔案的控制

  前一篇文章:“.NET操作Excel利器Spire.Xls使用(1)入門介紹 ”給大家介紹了Spire.XLS的基本功能和一些比較。這篇文章將重點介紹C#操作Excel檔案時,對Excel檔案本身的相關設定,全域性控制的內容。因為這也是C#讀寫Excel檔案時經常碰到的文章,也是我在使用過程中的一

OpenCV_05影象&視訊寫入檔案Write Image & Video to File

下面簡單介紹一個,通過攝像頭獲取到視訊檔案如何寫入檔案裡。//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

程式碼積累xml檔案讀取並輸出

      專案中用到了對xml文件的讀取,做如下總結: 一、準備      (1)XML文件示例 <span style="font-family:Microsoft YaHei;font-size:14px;"><Dishes> <

MFCVC讀ini檔案

可以用於載入時,讀取上一次的紀錄。 一:寫ini配置檔案: //獲取exe路徑 CString strPath; GetModuleFileName(NULL,strPath.GetBufferSetLength(MAX_PATH+1),M

delphi讀txt檔案

1. memo控制元件讀取txt memo1.Lines.LoadFromFile('E:/*/*.txt'); 2. Procedure NewTxt(FileName:String); Var F : Textfile; Begin if fileExists(Fil

實用jar轉換成exe檔案

上課後寫部落格的時間就少了,趁著清明假期把之前學到的一些東西整理一下~之前由於專案需要爬取很大的資料量,在機房用了多臺電腦去爬取資料,但是很麻煩的一點就是得“搬”程式碼還要進行相應的配置,後來瞭解到jar轉exe的做法感覺很便利~接下來就和大家分享一下>_

WPFMVVM滑鼠事件到Controller層

要使用Mouse Event,最快捷的方法便是前臺控制元件直接繫結事件,然後再後臺程式碼中實現。 在MVVM中,View層的後臺程式碼無法呼叫Contrller層的函式。(反過來可以Controller –> ViewModel –> View)

Servlet深入淺出Java重定向和請求轉發

列表 url地址 ssi 什麽 stack led 要去 處理 代碼 import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; i

ServletJava Servet Filter 過濾器

退出方法 efi rlogin file submit ati 姓名 ner lan Filter的設計思想Filter是一種AOP的設計思想 : 面向切面下面這是一個使用filter的登錄案例:我們通過一張圖片理解理解filer面向切面下面是項目的結構:下面是jsp文件:

JavaScriptJavaScript(V8)實現輸入輸出

https func split 舉例 tps blog turn 輸出 ret 首先看牛客網的樣例:https://www.nowcoder.com/questionTerminal/dae9959d6df7466d9a1f6d70d6a11417 計算a+b的和,每行包

疑問用python登錄驗證遇到的問題

password () http eas ini contact blog pre python 最近開始斷斷續續學習python,今天加入博客園,作為新人,和各位老師們討教了,以後多多照顧!為了大家能看清楚所以就截圖了,文末尾附源碼,說不定會有那位老師給我指教一番。###

Servlet監聽器入門

com .cn 入門 images mage 監聽 eight src 圖片 【Servlet】監聽器入門

Servlet使用org.eclipse.jetty實現小型的Servlet服務器

服務器 onu ets get span iter() servlet final status import java.io.IOException; import javax.servlet.ServletException; import javax.se

原創自己動手一個服務網關

exception 負責 lis world 前置 create ble ddr load 引言 什麽是網關?為什麽需要使用網關? 如圖所示,在不使用網關的情況下,我們的服務是直接暴露給服務調用方。當調用方增多,勢必需要添加定制化訪問權限、校驗等邏輯。當添加API網關後,