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)文章
Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作,結(jié)合實(shí)例形式分析了spring在bean銷毀之前的行為相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下2019-11-11
Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解
這篇文章主要介紹了Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
spring boot實(shí)現(xiàn)自動(dòng)輸出word文檔功能的實(shí)例代碼
這篇文章主要介紹了spring boot實(shí)現(xiàn)自動(dòng)輸出word文檔功能的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
Spring中property-placeholder的使用與解析詳解
本篇文章主要介紹了Spring中property-placeholder的使用與解析詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
Java?Calendar類使用之日期和時(shí)間處理指南
這篇文章主要給大家介紹了關(guān)于Java?Calendar類使用之日期和時(shí)間處理指南的相關(guān)資料,Calendar類是Java中用于處理日期和時(shí)間的抽象類,它提供了一種獨(dú)立于特定日歷系統(tǒng)的方式來處理日期和時(shí)間,需要的朋友可以參考下2023-12-12

