AJAX下载文件

1、由于传递的参数比较多,网页动态指定需要下载的文件,所以希望使用post方式传递参数。
2、ajax方式请求的数据只能存放在javascipt内存空间,下载文件时无法触发浏览器打开保存文件对话框,也就无法将下载的文件保存到硬盘上。参考地址
3、通常,在web前端需要下载文件,都是通过指定标签的href属性,访问服务器端url即可下载并保存文件到本地,但是这种方式使用的是HTTP GET方法,参数只能通过URL参数方式传递,无法使用POST方式传递参数。
4、但是,模拟表单提交同步方式下载文件,能够弹出保存文件对话框,所以,考虑使用表单提交方式下载文件,因此也就无法使用POST json data body提交数据。
此外,form表单需要注意:

每个input标签都要有name属性,后台代码(Springboot)对应解析时,使用name值作为key获取input值;
因此,后台代码的签名应该为:download(@RequestParam("ids") List ids, HttpServletRequest request, HttpServletResponse response),其中@RequestParam("ids")表明使用表单提交,而且需要解析key为ids的值。

直接使用Ajax post请求返回的数据,打印response,大概会显示为:


Ajax直接请求返回

示例代码:




  
    
    
    
    Document
  
  
    
    
  

//服务端
@PostMapping("/download")
public void download(@RequestParam("ids") List ids, HttpServletRequest request, HttpServletResponse response)  {
   //TODO: 业务逻辑,如获取文件
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setCharacterEncoding("UTF-8");
byte[] buffer = new byte[1024];
FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null;
try {
      fileInputStream = new FileInputStream(file);
      bufferedInputStream = new BufferedInputStream(fileInputStream);
      OutputStream oStream = response.getOutputStream();
      int i = bufferedInputStream.read(buffer);
      while (i != -1) {
          oStream.write(buffer, 0, i);
          i = bufferedInputStream.read(buffer);
       }
       return true;
       } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null) {
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
}
//后台下载代码粘贴不完善,可能无法使用,服务端代码和本文下载中心偏离,仅作说明

你可能感兴趣的:(AJAX下载文件)