zoukankan      html  css  js  c++  java
  • 下载文件的Restful接口的前端实现

    背景介绍

      后端是springboot框架,接口是restful风格接口,需求是异步实现一个文件下载,该文件是动态生成的,以流的方式返回给前端。存在的问题是,ajax不支持post方式传参数,并触发浏览器下载文件。经过多方调研,JavaScript原生XMLHttpRequest()对象可以实现。这里呈现主要的前端代码,以供参考,具体请参考XMLHttpRequest()的API文档介绍https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest

    实现代码

    1、实现函数方法

     1 function download(options) {
     2         var xhr = new XMLHttpRequest();//创建新的XHR对象
     3         xhr.open(options.method, options.url);//指定获取数据的方式和url地址
     4         xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8')
     5         xhr.responseType = 'blob';//以blob的形式接收数据,一般文件内容比较大
     6         // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
     7         xhr.onload = function () {
     8             // 请求完成
     9             if (this.status === 200) {
    10                 // 请求成功
    11                 var blob = this.response;
    12                 var reader = new FileReader();
    13                 reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
    14                 reader.onload = function (e) {
    15                     // 转换完成,创建一个a标签用于下载
    16                     var a = document.createElement('a');
    17                     a.download = 'backendCode.zip';//下载的文件名
    18                     a.href = e.target.result;
    19                     $("body").append(a);    // 修复firefox中无法触发click
    20                     a.click();
    21                     $(a).remove();
    22                 }
    23             }
    24         };
    25         xhr.send(options.data); //post请求传的参数
    26     }

    2、参数设置

    1 var options = {
    2                 url: '/geneCode',  //下载地址
    3                 data: requestDataStr, //要发送的数据
    4                 method: 'post'//post方式发送数据
    5             };

    3、数据对象。

    数据对象需要转换成字符串类型,后端才可以反序列化,映射到指定的javabean。

    1 var javaBean = {
    2                 author: “Eric”
    3             }
    4 var requestDataStr = JSON.stringify(javaBean);    

    结果

      在触发下载的函数中,引用该函数,即可实现post方式异步下载文件,触发浏览器的文件下载过程

     
  • 相关阅读:
    Android-WebView路由登录192.168.1.1
    Win7 & VirtualBox虚拟Ubuntu 本地虚拟机之间文件共享
    Android 简单的JNI编程
    Android ActionBar简单使用
    多个APK之间简单数据共享
    js代码移动Div 移动平台与PC平台
    JavaScript面向对象
    《SSO CAS单点系列》之 APP原生应用如何访问CAS认证中心
    insh.exe:*** Couldn't reserve space for cygwin's heap,Win32 error 0
    解决:SSM框架中普通类调用Service的问题 (转)
  • 原文地址:https://www.cnblogs.com/aric2016/p/10443060.html
Copyright © 2011-2022 走看看