从事IT行业,已经很长一段时间了。很多东西还处于初级阶段。比如,简单的servlet下载,自己还是无法理解。以前,一直在想,servlet的下载怎么才能够让前端响应,让别人知道有没有文件呢?至少没有文件的时候,可以提醒别人。通常,我会写两个servlet,一个用来判断文件是否存在,一个用来下载用的。上周做项目的时候,发现,并不需要那样做,完全可以在一个servlet里面处理了。毕竟是笔记,直接贴代码吧。
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/plain;charset=utf-8");
response.setHeader("Access-Control-Allow-Origin", "*");
String file_name =ObjectToString(request.getParameter("name"));
String contactPath = Configs.get("FileInConfig.filepath"); // 步骤一(换成自己的某个文件路径)
//String xx = getServletContext().getRealPath("/");
String fileSaveRootPath = (Session.getHttpSession().getServletContext().getRealPath("/").replace("\\", "/")).replace("/./", "/")+contactPath.substring(contactPath.indexOf("war/")+3); //拼接完整路径 // 步骤二(换成自己的完整路径)
//String file_name =ObjectToString(fileMap.get("FILE_NAME"));
String server_name =new String(request.getParameter("servername").getBytes("ISO-8859-1"), "UTF-8");
File file = new File(contactPath+file_name);
OutputStream os = null;
if(!file.exists()){
JSONObject json = new JSONObject();
System.out.println("文件不存在!");
json.put("retcode", "0");
json.put("retmsg", "没有文件");
response.getWriter().print(json);
}else{
os = response.getOutputStream();
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(server_name, "UTF-8"));
FileInputStream in = new FileInputStream(fileSaveRootPath+file_name);
//创建缓冲区
byte[] buffer = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
os.write(buffer, 0, len);
}
//关闭文件输入流
in.close();
//关闭输出流
os.close();
}
if(null != os){
os.flush();
os.close();
}
}
public static String ObjectToString(Object o) {
return o == null ? "" : o.toString().trim();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
通过上面的servlet,name为文件名,直接访问servlet,如果没有文件,会直接响应应到前台,有文件,就直接下载了。前端可以通过代码:
window.location.href = "servlet地址" 就能下载了。