关于servlet下载单文件

2018-05-17  本文已影响0人  邪恶的正派

        从事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地址"  就能下载了。

上一篇下一篇

猜你喜欢

热点阅读