从服务器下载文件+删除服务器生成的临时文件

    我们项目中有时需要从数据库中获取数据,将这些数据生成临时文件存储服务器中,再由用户端下载,在下载完毕后还要删除生成的临时文件。

     因为ajax是二进制的返回形式,而下载数据需要以流的形式,所以我这里选择以超链接的方式进入到后台;具体代码如下:

下载文件

后台代码:

 public void exportFile(HttpServletRequest request,HttpServletResponse response){
        String id = request.getParameter("id");
        Map map= new TroublesServiceImpl().exportFile(id);
        Configuration configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
       String path =  request.getSession().getServletContext().getRealPath("/files");//获取webroot文件下的files文件夹路径
        Template t = null;
        try {//在服务器中生成临时文件
            configuration.setDirectoryForTemplateLoading(new File(path));  //FTL文件所存在的位置
            t = configuration.getTemplate( File.separator + "trouble_model.ftl","UTF-8"); //文件名;File.separator:获取当前系统的路径斜杠
            String fileName = map.get("station")+"-"+map.get("title")+".doc";//导出的文件名为:油站名-故障主题
            String savePath = path +File.separator + fileName;//保存到服务器端文件的路径
            File outFile = new File(savePath);
            FileOutputStream fos = new FileOutputStream(outFile);
            OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
            Writer out = new BufferedWriter(osw);
            t.process(map, out);
            if (fos != null){
                fos.close();
            }
            if(osw != null){
                osw.close();
            }
            if(out != null){
                out.close();
            }
            //控制浏览器下载
            File file = new File(savePath);//savePath:是服务器存储临时文件的路径,记得带上文件名
            if(file.exists()){
                response.setContentType("application/x-msdownload");
                //设置头信息
                response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));//fileName:下载后的文件名。记得设置utf-8,不然文件名为乱码
                InputStream inputstrem = new FileInputStream(file);
                ServletOutputStream outputstream = response.getOutputStream();
                byte b[] = new byte[1024];//每次下载1024个字节
                int n;
                while((n = inputstrem.read(b)) != -1){//当后面还有字节时,继续循环下载
                    outputstream.write(b,0,n);
                }
                outputstream.close();//关闭流
                inputstrem.close();
            }else{
                request.setAttribute("errorResult", "文件不存在,下载失败!");//设置失败信息
                RequestDispatcher dispatcher = req.getRequestDispatcher("/sc.jsp");//当下载失败后,重定向到这个页面
		dispatcher.forward(req, resp);
            }
            File deleteFile=new File(savePath); //删除服务器上的临时文件
            deleteFile.delete();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

你可能感兴趣的:(项目随笔,后端)