程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java Web完成文件下載和亂碼處置辦法

Java Web完成文件下載和亂碼處置辦法

編輯:關於JAVA

Java Web完成文件下載和亂碼處置辦法。本站提示廣大學習愛好者:(Java Web完成文件下載和亂碼處置辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java Web完成文件下載和亂碼處置辦法正文


文件上傳和下載是web開辟中常碰到的成績,這幾天在做一個項目又用到了文件下載,之前也零零碎散記了些筆記,明天來做一下整頓。文件上傳還有待進一步測試,這裡先說一下文件下載。

1、文件下載處置流程

文件下載處置流程其實很清楚,即:

1、依據文件名或許文件途徑定位文件,詳細的戰略重要依據本身的需求,總之須要體系能找到的文件全途徑。

2、獲得輸出流,從目的文件獲得輸出流。

3、獲得輸入流,從response中獲得輸入流。

4、從輸出流讀入文件,經由過程輸入流輸入文件。這是真實的下載履行進程。

5、封閉IO流。

重要流程就是這個,別的就是一些需要的屬性設置,好比比擬主要的有設置文件的contentType類型等。

2、不煩瑣了了,上代碼

我是用Springmvc做的,但其適用其他的也一樣,重要須要HttpServletResponse對象和有用的目的文件。

1、前台代碼

/*
* 下載上傳的文件
*/
function downloadFromUpload(fileName){
window.location.href = path + "/download?dir=upload&fileName="+encodeURI(encodeURI(fileName));
}
/*
* 通俗下載
*/
function download(fileName){
window.location.href = path + "/download?dir=download&fileName="+encodeURI(encodeURI(fileName));
}

2、controller代碼

/**
* 文件下載(從上傳途徑下載)
* 
* @param request
* @param response
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/download")
public void downloadFile(HttpServletRequest request,
HttpServletResponse response, FileModel model) throws Exception {
String fileName = URLDecoder.decode(model.getFileName(), "UTF-8");
/*
* 限制只要upload和download文件夾裡的文件可以下載
*/
String folderName = "download";
if (!StringUtils.isEmpty(model.getDir())
&& model.getDir().equals("upload")) {
folderName = "upload";
} else {
folderName = "download";
}
String fileAbsolutePath = request.getSession().getServletContext()
.getRealPath("/")
+ "/WEB-INF/" + folderName + "/" + fileName;
FileTools.downloadFile(request, response, fileAbsolutePath);
log.warn("用戶Id:"
+ (Integer) (request.getSession().getAttribute("userId"))
+ ",用戶名:"
+ (String) (request.getSession().getAttribute("username"))
+ ",下載了文件:" + fileAbsolutePath);
}

這裡的下載邏輯是,前台只須要要求/download,並給出文件名參數便可。為了不中文亂碼,前台的文件名在作為參數時,應用了js的encodeURI()將其變成Unicode碼,然後後台解碼轉換為中文。別的因為項目標特別性,我這裡要下載的文件能夠會在upload和download兩個文件夾中,所以這裡多了一部門斷定邏輯。別的,我這裡將文件名和要求的文件夾稱號都封裝在了FileModel中。

3、下載邏輯完成。

這裡沒有效service了,直接用的靜態辦法完成。

/**
* 下載文件時指定下載名
* 
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @param filePath
* 文件全途徑
* @param fileName
* 指定客戶端下載時顯示的文件名
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,
HttpServletResponse response, String filePath, String fileName)
throws IOException {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
bis = new BufferedInputStream(new FileInputStream(filePath));
bos = new BufferedOutputStream(response.getOutputStream());
long fileLength = new File(filePath).length();
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data");
/*
* 處理各閱讀器的中文亂碼成績
*/
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes()
: fileName.getBytes("UTF-8"); // fileName.getBytes("UTF-8")處置safari的亂碼成績
fileName = new String(bytes, "ISO-8859-1"); // 各閱讀器根本都支撐ISO編碼
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));
response.setHeader("Content-Length", String.valueOf(fileLength));
byte[] buff = new byte[2048];
int bytesRead;
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bis.close();
bos.close();
}
/**
* 下載文件時不指定下載文件稱號
* 
* @param request
* HttpServletRequest
* @param response
* HttpServletResponse
* @param filePath
* 文件全途徑
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,
HttpServletResponse response, String filePath) throws IOException {
File file = new File(filePath);
downloadFile(request, response, filePath, file.getName());
}

這裡供給了重載的下載辦法,處理有時須要指定客戶端下載的文件名的需求。

3、留意事項

1、關於MIME類型的選擇

之前對MIME類型不是很懂得,發明網上有許多下載的源碼的MIME類型設置的紛歧樣。即這句

response.setContentType("multipart/form-data");

查了下這裡設置MIME類型的一個感化是告知客戶端閱讀器以甚麼格局處置要下載的文件。詳細的對應網上有許多講授,這I類設置成這類格局,普通會主動婚配格局。

2、指定客戶端下載文件名

有時我們能夠須要指定客戶端下載文件時的文件名,即這句代碼

response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName));
中的fileName,可以自界說。後面的部門普通不要動。

3、中文亂碼成績的處理

中文文件亂碼太罕見了,在項目體系架構剛搭建時,就應當同一一切的中文編碼,包含編纂器中、頁面中和數據庫中,推舉UTF-8編碼。假如用的Spring,還可以設置裝備擺設Spring的字符集過濾器,進一步防止中文亂碼。

(1)客戶端下載要求進程文件名亂碼

有時我們會碰到,前台頁面顯示中文文件名下載列表時正常的,但我們到後台發明要求中的文件名亂碼了,這時候采取後面所說的encodeURI可以處理。

(2)客戶端下載履行時文件名亂碼

在現實測試中發明,在其他閱讀器都可以履行的情形下,ie下中文文件名能夠會湧現亂碼。在網上看到了如許一段代碼,經測試,完善處理了分歧閱讀器的中文亂碼成績

/*
* 處理各閱讀器的中文亂碼成績
*/
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? fileName.getBytes()
: fileName.getBytes("UTF-8"); // fileName.getBytes("UTF-8")處置safari的亂碼成績
fileName = new String(bytes, "ISO-8859-1"); // 各閱讀器根本都支撐ISO編碼
response.setHeader("Content-disposition",
String.format("attachment; filename=\"%s\"", fileName));

(3)辦事器上文件亂碼

分歧的辦事器能夠因平台的分歧編碼方法也分歧,這裡也須要留意。詳細的處理計劃請拜見之前寫過的一篇文章:文件下載進程中中文亂碼處置

以上所述是小編給年夜家引見的Java Web完成文件下載和亂碼處置辦法,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved