前端请求二进制流文件

需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需要请求 Service 根据参数动态生成图片返回图片二进制流(下载文件相同),并在client端显示。

  • 错误方式:使用jquery
$.ajax({
    method: "GET",
    url: serverUrlBase + "/server/images/" + mapid + "/files/png",跨域,请求会返回流文件 png图片
    beforeSend: function (xhr) {
        xhr.setRequestHeader("client_type", "DESKTOP_WEB");
        xhr.setRequestHeader("desktop_web_access_key", _desktop_web_access_key);
    },
    success: function (data) {
        $("#remoteimg").attr("url", data);
    }
});

一顿操作猛如虎

google了 一番 发现query将返回的数据转换为了string,不支持blob类型。console.log(typeof(data))会看到是string类型。

  • 正确打开方式:
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = "blob";
xhr.setRequestHeader("client_type", "DESKTOP_WEB");
xhr.setRequestHeader("desktop_web_access_key", _desktop_web_access_key);
xhr.onload = function() {
    if (this.status == 200) {
        var blob = this.response;
        var img = document.createElement("img");
        img.onload = function(e) {
            window.URL.revokeObjectURL(img.src); //释放。
        };
        img.src = window.URL.createObjectURL(blob);//将blob加载到img中 由于blob太大 会有性能影响 应该在加载之后释放
        $("#imgcontainer").html(img);    
    }
}
xhr.send();
  • 请求流文件下载:
function download() {
    var url = 'download/?filename=aaa.txt';
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);        // 也可以使用POST方式,根据接口
    xhr.responseType = "blob";    // 返回类型blob
    // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
    xhr.onload = function () {
        // 请求完成
        if (this.status === 200) {
            // 返回200
            var blob = this.response;
            var reader = new FileReader();
            reader.readAsDataURL(blob);    // 转换为base64,可以直接放入a表情href
            reader.onload = function (e) {
                // 转换完成,创建一个a标签用于下载
                var a = document.createElement('a');
                a.download = 'data.xlsx';
                a.href = e.target.result;
                $("body").append(a);    // 修复firefox中无法触发click
                a.click();
                $(a).remove();
            }
        }
    };
    // 发送ajax请求
    xhr.send()
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、Activity生命周期? onCreate() -> onStart() -> onResume() -> ...
    01_小小鱼_01阅读 2,839评论 0 44
  • 1.回放我在事件中是什么情绪? 情绪:失落 事件:今天早上去店里啥都找不到 所有我原来的东西都不在地方了 办公桌也...
    周山英阅读 377评论 5 3
  • 还能 再重逢吗? 你离开得悄无声息 还能 再相遇吗? 有一种离别没有归期 甚至 我都不知道 你是否记得 那些有关我...
    诗尤澈阅读 183评论 0 0
  • 欢迎16位文员 —— 孙转平 你轻轻的走来 带着振兴十里文化的翅膀 在小茿舞台飞翔 你轻轻的走来 带着振...
    勿忘我_36e2阅读 330评论 0 1
  • 文/余热焰 原创作品集 无垠的海,远离尘世的喧嚣 却因连绵淫雨、狂飚不停而忧 你看这满天的乌云,心事如织 风的翅膀...
    余热焰阅读 2,059评论 47 56