文件的下载
package cn.class3g.web.servlet;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ListFileServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String filePath = this.getServletContext().getRealPath("/WEB-INF/upload");
Map fileMap = new HashMap();
traverse(new File(filePath), fileMap);
request.setAttribute("fileMap", fileMap);
request.getRequestDispatcher("/listfiles.jsp").forward(request, response);
}
private void traverse(File file, Map fileMap) {
if(file.isFile()){ //如file为文件,添加到fileMap中去
String uuidName = file.getName();
String realName = uuidName.substring(uuidName.lastIndexOf("_")+1);
fileMap.put(uuidName, realName );
}else{ //如file为目录,则递归调用
File[] subFiles = file.listFiles();
for(File f : subFiles){
traverse(f,fileMap);
}
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
/
package cn.class3g.web.servlet;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uuidName = request.getParameter("uuidName");
String realName = request.getParameter("realName");
//因为参数是通过url传过来的,所以需要手动进行编码转换
uuidName = new String(uuidName.getBytes("iso8859-1"),"utf-8");
realName = new String(realName.getBytes("iso8859-1"),"utf-8");
//又因为realName需要放到response的头contetn-dispposition中去,发送到客户的浏览器端,
//所以需要对它调用URLEncoder的encode方法进行url编码,才可以保证客户取到正确的中文文件名。
realName = URLEncoder.encode(realName, "utf-8");
System.out.println("uuidName="+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 fis = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while((len=fis.read(buffer))>0){
out.write(buffer, 0, len);
}
fis.close();
}
}
private 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;
System.out.println("fileAddr="+fileAddr);
return fileAddr;
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}