1. 程式人生 > >下載檔名空格變加號、亂碼、被截斷問題解決

下載檔名空格變加號、亂碼、被截斷問題解決

用java寫了一個下載檔案的類,旨在用瀏覽器下載服務端檔案,程式碼大致如下:

/**
	 * 檔案下載
	 * @param res
	 * @param filePath
	 * @throws UnsupportedEncodingException
	 */
	public void downloadFile(HttpServletRequest req,HttpServletResponse res,String filePath) throws UnsupportedEncodingException{
		if(null == filePath || "".equals(filePath.trim())){
			return;
		}
		filePath = Util.getUTF8(filePath);
		res.setCharacterEncoding("UTF-8");
		String fileName = URLEncoder.encode(getFileName(filePath), "UTF-8");
		res.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
		OutputStream os = null;
		FileInputStream fis = null;
		try {
			os = res.getOutputStream();
			fis = new FileInputStream(filePath);
			byte[] b = new byte[100];
			int c;
			while((c=fis.read(b))>0){
				os.write(b,0,c);
			}
			os.flush();
			os.close();
		} catch (IOException e) {
			log.error(e);
			e.printStackTrace();
		}finally{
			if(null!=fis){
				try {
					fis.close();
				} catch (IOException e) {
					log.error(e);
					e.printStackTrace();
				}
			}
			if(null!=os){
				try {
					os.close();
				} catch (IOException e) {
					log.error(e);
					e.printStackTrace();
				}
			}
		}
	}
1.檔名有空格時,空格變為加號

上面的程式碼除錯執行後,用谷歌和IE進行除錯下載,內容沒有問題,但卻發現要下載的檔名中含有空格的時候,空格變成了加號如下圖:


新增以下程式碼,對檔名進行空格替換即可解決:

fileName=fileName.replaceAll("\\+","%20");    //處理空格轉為加號的問題

2.下載檔案的檔名稱亂碼

在上面對檔名處理後,發現在谷歌和IE沒有問題,而火狐瀏覽器出現中文亂碼:

   

覺得奇怪,因為看最上面的程式碼塊中,已經進行過UTF-8轉換。但知道這是由於對檔名進行編碼的問題,於是用以下方式對檔案進行編碼處理:

if(req.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
fileName = URLEncoder.encode(getFileName(filePath), "UTF-8");
}else{
	fileName = new String((getFileName(filePath)).getBytes("UTF-8"),"ISO8859-1");
}
這樣處理後,該問題得到解決,也就是我們要指定UTF-8編碼的標準,各個瀏覽器預設的編碼標準可能不大一樣。

3.下載檔案被截段

進行上面兩次處理後,谷歌和IE瀏覽器都已正常,但發現,在火狐瀏覽器中,因為要下載的檔名中有空格,下載檔案被截斷了,導致檔案字尾被去掉,檔案型別無從得知,只知道為“檔案”型別,如圖:


作為一個嚴謹的程式設計師,還是要解決好相容性的。將上面程式碼中setHeader方法中的檔名,用字串包起來即以解決,程式碼改為如下:

res.setHeader("Content-Disposition", "attachment;fileName=\"" + fileName +"\"");

至此,通過對檔名字串進行處理,下載檔名空格變加號、亂碼、被截斷問題都得以解決。


相關推薦

下載檔名空格加號亂碼截斷問題解決

用java寫了一個下載檔案的類,旨在用瀏覽器下載服務端檔案,程式碼大致如下: /** * 檔案下載 * @param res * @param filePath * @throws UnsupportedEncodingException */ pu

"SQLServer工具中為什麼空格點號""Oracle SQL按空格點號"結果格式變換SQL語句(重複替換擷取空格去小數點後的位數)

我暑假時用觸屏板點選SQLServer,不知道怎麼個亂點亂按快捷鍵。。。就將空格用小點"·"代替了 (當然,我找過度娘,可都沒有對應的答案,只有說"Oracle按空格變點號”的問題答案,下面會給連結! 因此,看來,目前只有我遇到了???也許遇到了的人沒記錄在百度或其他網站,那

java下載中文及空格加號解決方案

1.只是做了中文處理 前臺jsp頁面程式碼如下: buildpre.append("<td><a href=\"down.action?fname="+preDeatil.getPafilename().replaceAll(" ", "&nbsp

作業系統亂碼驅動鍵盤失靈win7

今天碰到了亂碼問題,原因是驅動引起。鍵盤的shift鍵組合部分失靈了,就去重灌驅動,然後不知道為何驅動人生有BUG,莫名其妙就把滑鼠驅動刪了又裝,於是就悲劇了,一大波亂碼。問題變得更麻煩,找不到解決辦法就換了鍵盤重灌一個鍵盤驅動,(可能這個驅動有問題)引發系統檔案amd_xata.sys數字簽名無法

URLEncoder.encode轉譯後“空格加號”的問題

URLEncoder.encode轉譯後“空格”變“加號”的問題 例如: String test = “++ ++ ++”; test = URLEncoder.encode(test); 對字串test進行編碼,但是發現空格全部都變成了加號 test = URLEncoder.enco

爬蟲之代理亂碼驗證碼

代理 爬蟲中為什麼需要使用代理 一些網站會有相應的反爬蟲措施,例如很多網站會檢測某一段時間某個IP的訪問次數,如果訪問頻率太快以至於看起來不像正常訪客,它可能就會會禁止這個IP的訪問。所以我們需要設定一些代理IP,每隔一段時間換一個代理IP,就算IP被禁止,依然可以換個IP繼續爬取。 代理的分

Android—串列埠相關(2.串列埠除錯時出現的亂序亂碼缺資料問題)

自己在開發除錯過程中走了很多的坑,找了很多的文章,總結起來希望以後再碰到的時候能想起來,其中參考了大佬的相關回答:大佬的連結使用谷歌的串列埠除錯工具有時會出現亂序和亂碼以及缺資料的現象亂序問題有以下幾種出現的可能:1.在配置相關串列埠時配置了多個串列埠原因:導致多個串列埠同時

位元組流字元流asciigb2312gbkgb18030亂碼什麼時候使用位元組流,什麼時候使用字元流,二者區別。分分鐘透徹理解。

早先在 Java IO包裡面出現的都是位元組流,因為資料,無論是硬碟上的還是記憶體中的,都是位元組,都是二進位制資料10101的方式進行傳輸或儲存的。那麼為什麼後來又出現了個字元流的概念呢? 在我們處理資料的時候,資料的種類有很多,比如dvd,圖片,文字,mp3等對於dvd

USB和SD同步亂碼空間大小

最近解了一些bug,記錄一下。1.同步問題在USB裡增加刪除修改檔案了,samba/ftp裡不能同步,實際上是掛載問題。SD分割槽如下:mmcblk0: 是mmc介面0(有些系統有多個SD卡介面的)mmcblk0p1:是mmc介面0下的第一個分割槽mmcblk0p2:是mmc

HTTP傳送過程中中文亂碼特殊(+號空格)字元亂碼解決方案

一、字符集亂碼: 原因:       當使用位址列提交查詢引數時,如果不編碼,非英文字元會按照作業系統的字符集進行編碼提交到伺服器,伺服器會按照配置的字符集進行解碼,所以如果兩者不一致就會導致亂碼。 解決方案:       頁面端發出的資料作兩次encodeURI:

eclipse基本設置----中文亂碼行數顯示縮進方式行末空格和空行自動刪除常用註解

空行 name info prop 刪除行 ber 導入 影響 Edito 一、中文亂碼   window系統下,Eclipse中導入新的項目的時候,可能會遇到中文亂碼的問題。   解決方案:將系統默認的格式為GBK改成UTF-8。以下是具體解決方法,可以根據需要選擇不同的

ZK框架檔案下載檔名亂碼問題(空格,#截斷解決

在Java的web開發中,檔案下載功能的檔名檔名亂碼問題是經常遇到的。 對於這個問題,不同的瀏覽器,解決的方法不太一樣。 IE的話,通過URLEncoder對filename進行UTF8編碼。 而其他的瀏覽器(firefox、chrome、safari、opera),則要通過位元組

jquery 選擇器 空格大於加號波浪線區別

逗號:$('pre, a') 表示選擇pre,a兩個元素選取 class 為 "intro"、"demo" 或 "end" 的所有元素:$(".intro,.demo,.end")空格:$('parent childchild')表示獲取parent下的所有的childchi

JAVA下載刪除修改檔名

JAVA檔案的下載 /** * 下載檔案 * * @param savepath 儲存路徑 * @param resurl 資源路徑 * @param fileName 自定義資源名 */ public String getInternet

Linux下使用Vi時方向鍵亂碼刪除鍵不能使用的解決方法(親測有效)

在Linux下編輯一些檔案,這就涉及到了Vi這個編輯器。在Linux下,初始使用Vi的時候有兩個典型的問題: 1、在編輯模式下使用方向鍵的時候,並不會使游標移動,而是在命令列中出現A、B、C、D四個字母; 2、當編輯出現錯誤,想要刪除時,發現Backspace鍵不起作用,只

linux就該這麽學-第4章 寫入轉義單引號別名全局

http ima src com 分享 全局變量 .com 文件 nbsp 一、寫入 1、> 清空寫入文件 2.>>追加寫入文件 3.2>>錯誤追加寫入文件 二、轉義 linux就該這麽學-第4章 寫入、轉義、單引號、別名、全局變量

JDFS:一款分布式文件管理實用程序第一篇(線程池epoll上傳下載)

cpu nload tree 程序 fun 是的 發的 fop let 一 前言   截止目前,筆者在博客園上面已經發表了3篇關於網絡下載的文章,這三篇博客實現了基於socket的http多線程遠程斷點下載實用程序。筆者打算在此基礎上開發出一款分布式文件管理實用程序,截止目

[原創]Nexus5 源碼下載編譯真機燒錄過程記錄

慢慢 prop sha shell 腳本 .cn 等待 strong download dos asop使用清華鏡像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一開始使用每月初始化包的方式因為無法搞定版本的問題,沒能通過編

WTL:下載安裝初見

rec 6.0 amp img file point 向導 temp bob 簡介 WTL: Windows Template Library 基於ATL對Win32 API的封裝 C++庫,用於開發Windows應用程

判斷量是否定義空值問題—— “- :- := :+ :? ”

區別 color span host 警告 blog code style 變量 分析 - :- := :+ :? 的區別 1、判斷變量是否定義;  r=${xx-"mmmmmmmmmmmmmmmmmmmmmmmmmmmmm"} [[email pr