【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裡面什麼都沒有,
關鍵是download.java裡面的程式碼,獲取服務端存放檔案的真實路徑之後,把這個檔案先寫到緩衝區,再把緩衝區的東西寫到respond輸出流供使用者下載。<?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>
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':'
【Qt】QSettings讀寫登錄檔、配置檔案【轉】
簡述 一般情況下,我們在開發軟體過程中,都會快取一些資訊到本地,可以使用輕量級資料庫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> <
【MFC】VC讀寫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的做法感覺很便利~接下來就和大家分享一下>_
【WPF】【MVVM】把滑鼠事件寫到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
【Servlet】Java Servet Filter 過濾器
退出方法 efi rlogin file submit ati 姓名 ner lan Filter的設計思想Filter是一種AOP的設計思想 : 面向切面下面這是一個使用filter的登錄案例:我們通過一張圖片理解理解filer面向切面下面是項目的結構:下面是jsp文件:
【JavaScript】JavaScript(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網關後,