第一步:ListFileServlet——>第二步:listfiles.jsp——>第三步:DownloadServlet.java;;
一、ListFileServlet.java
1)首先得到文件保存目錄的真實路徑
2)創建方法:void listFiles(File file,Map map),迭代處理所有目錄及文件,將所有文件存入Map對象中,K——V uuidname——realname
3)將Map對象寫入request,傳至listfiles.jsp
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到保存上傳文件的文件夾
String savepath = this.getServletContext().
getRealPath("/WEB-INF/upload");
Map map = new HashMap();
//迭歸文件夾下面的所有文件 迭歸過程中如何保存迭歸出來的數據
listFiles(new File(savepath),map);
request.setAttribute("map", map);
request.getRequestDispatcher("/listfile.jsp").
forward(request, response);
}
private void listFiles(File file,Map map) {
if(file.isFile()){
String uuidname = file.getName();
String realname = uuidname.
substring(uuidname.indexOf("_")+1);
map.put(uuidname, realname);
}else{
//得到目錄下所有的文件
File files[] = file.listFiles();
for(File f: files){
listFiles(f,map);
}
}
}
二、listfiles.jsp
取出map中的數據,並構建url作爲下載鏈接的href屬性值:
<c:forEach var="me" items="${filesMap}">
<c:url var="fileAddr" value="/servlet/DownloadServlet">
<c:param name="uuidName">${me.key }</c:param>
<c:param name="realName">${me.value }</c:param>
</c:url>
文件名:${me.value }<a href="${fileAddr }" >下載</a><br/>
</c:forEach>
三、DownloadServlet.java
1)從request中取出文件名等信息,注意中文字符使用的urlencoding,需要進行手動編碼轉換。
2)根據文件的uuidName計算出文件的存儲路徑
3)判斷目標文件是否存在
4)設置response的header中的content-disposition 值爲attachment;filename=realName
5)獲取輸入流,並寫入輸出流
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uuidName = request.getParameter("uuidName");
String realName = request.getParameter("realName");
uuidName = new String(uuidName.getBytes("iso8859-1"),"utf-8");
//真實文件名取出來必須經過轉碼,然後因爲需要作爲下載鏈接地址,所以需要再一次轉碼
realName = URLEncoder.encode(new String(realName.getBytes("iso8859-1"),"utf-8"),"utf-8");
System.out.println(getFileAddr(uuidName));
File file = new File(getFileAddr(uuidName));
if(!file.exists()){
request.setAttribute("message", "下載的文件不存在!");
request.getRequestDispatcher("/message.jsp")
.forward(request, response);
}else{
response.setHeader("content-disposition", "attachment;filename="+realName);
FileInputStream fin = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len = fin.read(buffer))>0){
out.write(buffer,0,len);
}
fin.close();
}
}
public String getFileAddr(String uuidName){
int dir1 = uuidName.hashCode() & 0xf;
int dir2 = (uuidName.hashCode()>>4) & 0xf;
String fileAddr = this.getServletContext().getRealPath("/WEB-INF/upload")
+"\\"+ dir1+"\\" + dir2 +"\\" + uuidName;
return fileAddr;
}