Java response響應(yīng)體和文件下載實(shí)現(xiàn)原理
通過response 設(shè)置響應(yīng)體:
響應(yīng)體設(shè)置文本:
PrintWriter getWriter()
獲得字符流,通過字符流的write(String s)方法可以將字符串設(shè)置到response 緩沖區(qū)中,隨后Tomcat會(huì)將response緩沖區(qū)中的內(nèi)容組裝成Http響應(yīng)返回給瀏覽 器端。
關(guān)于設(shè)置中文的亂碼問題
原因:response緩沖區(qū)的默認(rèn)編碼是iso8859-1,此碼表中沒有中文,可以通過 response的setCharacterEncoding(String charset) 設(shè)置response的編碼,
但我們發(fā)現(xiàn)客戶端還是不能正常顯示文字。
原因:我們將response緩沖區(qū)的編碼設(shè)置成UTF-8,但瀏覽器的默認(rèn)編碼是本地系統(tǒng)的編碼,因?yàn)槲覀兌际侵形南到y(tǒng),所以客戶端瀏覽器的默認(rèn)編碼是GBK,我們可以手動(dòng)修改瀏覽器的編碼是UTF-8。
我們還可以在代碼中指定瀏覽器解析頁面的編碼方式,通過response的setContentType(String type)方法指定頁面解析時(shí)的編碼是UTF-8。
response.setContentType("text/html;charset=UTF-8");
上面的代碼不僅可以指定瀏覽器解析頁面時(shí)的編碼,同時(shí)也內(nèi)含 setCharacterEncoding的功能,所以在實(shí)際開發(fā)中只要編寫 response.setContentType("text/html;charset=UTF-8"),就可以解決頁面輸出中文亂碼問題。
package com.oracle;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import sun.misc.BASE64Encoder;
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//服務(wù)器獲取文件名(文件名是中文的話,獲取的時(shí)候就成了亂碼了)
String filename = request.getParameter("file");//??.png
//get請(qǐng)求中---解決文件名中文亂碼問題
filename =new String(filename.getBytes("ISO-8859-1"),"UTF-8");//亂碼.png
//獲取User-Agent獲取客戶端瀏覽器到底是哪個(gè)瀏覽器
String agent=request.getHeader("User-Agent");
String filenameEncoder="";
if (agent.contains("MSIE")) {
// IE瀏覽器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
filenameEncoder= filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐瀏覽器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder= "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它瀏覽器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
}
//告知瀏覽器文件的類型(響應(yīng)體)
response.setContentType(getServletContext().getMimeType(filename));
//告知瀏覽器以附件的方式提供下載功能 而不是解析
response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);
//服務(wù)器獲取后開始進(jìn)行復(fù)制的程序:獲取字節(jié)輸出流
ServletOutputStream sos = response.getOutputStream();
//獲取數(shù)據(jù)源的絕對(duì)路徑
String realpath = getServletContext().getRealPath("download/"+filename);
//獲取字節(jié)輸入流
FileInputStream fis =new FileInputStream(realpath);
//開始復(fù)制
byte[] bytes=new byte[1024];
int len=0;
while((len=fis.read(bytes))!=-1){
sos.write(bytes, 0, len);
}
//釋放資源
fis.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="/WEB02/DownLoadServlet?filename=a.txt" rel="external nofollow" >a.txt</a> <a href="/WEB02/DownLoadServlet?filename=a.wmv" rel="external nofollow" >a.wmv</a> <a href="/WEB02/DownLoadServlet?filename=科比.png" rel="external nofollow" >科比.png</a> <a href="/WEB02/DownLoadServlet?filename=a.zip" rel="external nofollow" >a.zip</a> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android中通過RxJava進(jìn)行響應(yīng)式程序設(shè)計(jì)的入門指南
- JavaFX桌面應(yīng)用未響應(yīng)問題解決方案
- java實(shí)現(xiàn)響應(yīng)重定向發(fā)送post請(qǐng)求操作示例
- JavaWeb Refresh響應(yīng)頭代碼實(shí)例詳解
- javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng)
- java web請(qǐng)求和響應(yīng)中出現(xiàn)中文亂碼問題的解析
- Java Web請(qǐng)求與響應(yīng)實(shí)例詳解
- Java并發(fā)編程之性能、擴(kuò)展性和響應(yīng)
- 淺談Java響應(yīng)式系統(tǒng)
相關(guān)文章
Java實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接的最詳細(xì)教程分享
JDBC,Java?Database?Connectivity,即Java數(shù)據(jù)庫(kù)連接,是?Java?中的一套和數(shù)據(jù)庫(kù)進(jìn)行交互的API,本文就來講講Java如何利用JDBC實(shí)現(xiàn)數(shù)據(jù)庫(kù)的連接吧2023-05-05
非常適合新手學(xué)生的Java線程池優(yōu)化升級(jí)版
作者是一個(gè)來自河源的大三在校生,以下筆記都是作者自學(xué)之路的一些淺薄經(jīng)驗(yàn),如有錯(cuò)誤請(qǐng)指正,將來會(huì)不斷的完善筆記,幫助更多的Java愛好者入門2022-03-03
java實(shí)現(xiàn)圖片無損任意角度旋轉(zhuǎn)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)圖片無損任意角度旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02
Spring Boot Event Bus用法小結(jié)
Spring Boot Event Bus是Spring框架中事件驅(qū)動(dòng)編程的一部分,本文主要介紹了Spring Boot Event Bus用法小結(jié),感興趣的可以了解一下2023-09-09
Mybatis動(dòng)態(tài)SQL實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Mybatis動(dòng)態(tài)SQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Java HashTable的原理與實(shí)現(xiàn)
Java中的HashTable是一種線程安全的哈希表實(shí)現(xiàn),它可以高效地存儲(chǔ)和快速查找數(shù)據(jù),本文將介紹Java中的HashTable的實(shí)現(xiàn)原理、常用方法和測(cè)試用例,需要的小伙伴可以參考一下2023-09-09
利用Stream聚合函數(shù)如何對(duì)BigDecimal求和
這篇文章主要介紹了利用Stream聚合函數(shù)如何對(duì)BigDecimal求和問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

