后台生成文件,前端可以下载文件下来

效果是这样,前端一点下载可以下载后台生成文件的。

首先是前台的显示,调用后台的下载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);
    }
}

这样就可以了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
前端使用Vue发送请求下载PDF文件需要用到两个技术:axios和Blob。 首先,在Vue项目中安装axios: ``` npm install axios --save ``` 然后,在Vue组件中使用axios发送请求下载PDF文件: ```javascript import axios from 'axios' export default { methods: { downloadPDF() { axios({ url: 'your-backend-api', method: 'GET', responseType: 'blob' // 返回类型为blob }).then(response => { const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute('download', 'file.pdf') // 下载文件名 document.body.appendChild(link) link.click() }) } } } ``` 在代码中,我们设置了axios的请求类型为'GET',返回类型为'blob'。当请求成功时,我们将response.data转换为Blob类型,创建URL并生成一个a标签用于下载。将a标签添加到body中,模拟用户点击下载。最后,我们需要注意设置下载文件文件名。 在后端,你需要设置响应头的Content-Type为'application/pdf',推荐使用node.js的mime模块来获取正确的Content-Type: ```javascript const fs = require('fs') const path = require('path') const mime = require('mime') app.get('/download', (req, res) => { const filePath = path.join(__dirname, 'file.pdf') const fileStream = fs.createReadStream(filePath) const contentType = mime.getType(filePath) res.setHeader('Content-Type', contentType) res.setHeader('Content-Disposition', 'attachment; filename=file.pdf') fileStream.pipe(res) }) ``` 在代码中,我们使用fs模块读取文件流,使用mime模块获取正确的Content-Type并设置响应头。最后,将文件流通过管道pipe到响应中,完成下载
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值