後臺生成文件,前端可以下載文件下來

效果是這樣,前端一點下載可以下載後臺生成文件的。

首先是前臺的顯示,調用後臺的下載url:

<div class="form-inline ml10">
    <a class="btn btn-default" href="/servlet/DownLoadServlet">下載建表sql</a>
</div>

在web.xml中配置一下url的位置,主要的意思是把控制下載的類名和對應的url對應上:

<servlet>
     <servlet-name>DownLoadServlet</servlet-name>
     <servlet-class>com.jd.data.manage.controller.DownLoadServlet</servlet-class>
</servlet>

<servlet-mapping>
     <servlet-name>DownLoadServlet</servlet-name>
     <url-pattern>/servlet/DownLoadServlet</url-pattern>
</servlet-mapping>

然後是文件生成部分的代碼,收到flag提示之後生成文件:

@RequestMapping(value = "/ar_monitor_sql_generate/download/ajax", method = RequestMethod.POST)
    public void downloadFile(RerunSqlGenerateInfo obj,HttpServletRequest request,HttpServletResponse response) throws IOException {
        String flag = request.getParameter("flag");
        String filename = "create_sql.sql";
        String filepath;
        filepath = request.getSession().getServletContext().getRealPath("/WEB-INF/uploads/"+filename);
        File file = new File(filepath);
        logger.info(file.getAbsolutePath());
        file.createNewFile();
        FileWriter fileWriter = new FileWriter(file);

        String create_sql = this.rerunSqlGenerateInfo.getCreate_sql();
        String insert_sql = this.rerunSqlGenerateInfo.getInsert_sql();
        fileWriter.write(create_sql);
        fileWriter.close();
}

servlet下載文件邏輯:

package com.jd.data.manage.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;

public class DownLoadServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String filename = "create_sql.sql";
        String filepath = request.getSession().getServletContext().getRealPath("/WEB-INF/uploads/"+filename);
        //通過文件名找出文件的所在目錄
        //得到要下載的文件
        File file = new File(filepath);
        //如果文件不存在
        if(!file.exists()){
            request.setAttribute("message", "您要下載的資源已被刪除!!");
            request.getRequestDispatcher("/message.jsp").forward(request, response);
            return;
        }
        response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
        FileInputStream in = new FileInputStream(filepath);
        OutputStream out = response.getOutputStream();
        byte buffer[] = new byte[1024];
        int len = 0;
        while((len=in.read(buffer))>0){
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();
    }

    /**
     * @Method: findFileSavePathByFileName
     * @Description: 通過文件名和存儲上傳文件根目錄找出要下載的文件的所在路徑
     * @param filename 要下載的文件名
     * @param saveRootPath 上傳文件保存的根目錄,也就是/WEB-INF/upload目錄
     * @return 要下載的文件的存儲目錄
     */
    public String findFileSavePathByFileName(String filename,String saveRootPath){
        int hashcode = filename.hashCode();
        int dir1 = hashcode&0xf;  //0--15
        int dir2 = (hashcode&0xf0)>>4;  //0-15
        String dir = saveRootPath + "\\" + dir1 + "\\" + dir2;  //upload\2\3  upload\3\5
        File file = new File(dir);
        if(!file.exists()){
            //創建目錄
            file.mkdirs();
        }
        return dir;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}

這樣就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章