Ajax请求二进制流并在页面展示
后端代码:
public void getIntegralQrcode(HttpServletResponse response, String token) throws BizException, IOException, WriterException {
logger.info("qrcode info ...");
response.setCharacterEncoding("UTF-8");
response.reset();
ServletOutputStream os = response.getOutputStream();
// 请求地址
String url = ConfigProperties.getUrl();
logger.info("qrcode info request url -- > {}", url);
// 加密内容
String base64Code = Base64Utils.getBase64Code(WechatQrcodeTypeEnum.H5.getValue(), maculaConfig.getIntegralQrcodeScanName(), null);
logger.info("qrcode info base64Code -- > {}", base64Code);
// 二维码内容
String content = WechatQrcodeUtil.getRequestUrl(url, "2", base64Code);
logger.info("qrcode info -- > {}", content);
QRCodUtil.encodeQRCodeImage(content, null, WechatQrcodeUtil.IMAGE_WIDTH, WechatQrcodeUtil.IMAGE_HEIGHT, os);
os.flush();
os.close();
}
后端工具类:
public class WechatQrcodeUtil {
static Logger logger = LoggerFactory.getLogger(WechatQrcodeUtil.class);
private static final String TYPE = "type";
private static final String NAME = "name";
private static final String PARAM = "param";
// 加密内容定义区域key
private static final String base64= "base64";
private static final String EQUAL_STR = "=";
private static final String AND_STR = "&";
private static final String QUE_STR = "?";
public static final int IMAGE_WIDTH = 262;
public static final int IMAGE_HEIGHT = 262;
/**
* 放入二维码内容
*
* @param url 请求地址
* @param modelType 请求模块名称
* @param base64 加密内容
* @return
*/
public static String getRequestUrl(String url, String modelType, String base64){
StringBuffer sb = new StringBuffer();
sb.append(url);
sb.append(QUE_STR);
sb.append(TYPE).append(EQUAL_STR).append(modelType);
sb.append(AND_STR);
sb.append(base64).append(EQUAL_STR).append(base64);
logger.info("request address: {}", sb.toString());
return sb.toString();
}
/**
* 获取加密参数内容
* @param type 类型 @see{WechatQrcodeTypeEnum}
* @param name
* <li>channelName:</li>
* <li>moduleName:</li>
* <li>httpurl:在线页面地址</li>
* @param urlParams key:value,key:value,...
*
* @return
* @throws UnsupportedEncodingException
*/
public static String getBase64Code(String type, String name, Object... urlParams) throws UnsupportedEncodingException{
StringBuffer sb = new StringBuffer();
sb.append(TYPE).append(EQUAL_STR).append(type);
sb.append(AND_STR);
sb.append(NAME).append(EQUAL_STR).append(name);
if(urlParams != null){
sb.append(AND_STR);
sb.append(PARAM).append(EQUAL_STR).append(urlParams);
}
logger.info("request params: {}", sb.toString());
return Base64.encode(sb.toString().getBytes());
}
}
前端Ajax请求:
<#--
* README
* 在页面定义页面token<i><@macula.formToken /></i>
*
* @author add by liuyc in 2018-11-28
*
--> <div id="qrcode-image" class="bottom-image"></div> <script type="text/javascript"> window.onload = function(){ var xhr = new XMLHttpRequest(); var url = base + "/qrcode?token=" + $("input[name='ftoken']").val();
xhr.open('GET', url, true); xhr.responseType = "blob";
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);
document.getElementById("qrcode-image").appendChild(img);
}
}
xhr.send();
} </script>
写入页面后的展示:

Ajax请求二进制流并在页面展示的更多相关文章
- ajax 请求二进制流 图片
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> ...
- ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
写在前面 :从提出需求到完美的解决问题,实现过程是曲折的. 需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需要请求 Service 返 ...
- 第六章 MVC之 FileResult和JS请求二进制流文件
一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...
- ajax请求二进制流图片并渲染到html中img标签
日常显示图片都诸如这种形式:直接使用img的src属性 <img src="图片路径.地址" alt="" /> 以上方法无法在获取图片请求中设置请 ...
- JavaScript读二进制文件并用ajax传输二进制流
综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...
- 通过配置http拦截器,来进行ajax请求验证用户登录的页面跳转
在.NET中验证用户是否登录或者是否过期,若需要登录时则将请求转向至登录页面. 这个流程在进行页面请求时是没问题的,能正确进行页面跳转. 然而在使用xmlhttprequest时,或者jq的getJs ...
- ajax请求后弹开新页面被浏览器拦截
window.open()我想应该很多人都不陌生吧,它可以实现除用a标签以外来实现打开新窗口! 最近开发项目用到时,却遇到了麻烦,本来好好的弹出窗口,结果被浏览器无情的给拦截了! 代码如下: $.ge ...
- SpringMVC响应Ajax请求(@Responsebody注解返回页面)
项目需求描述:page1中的ajax请求Controller,Controller负责将service返回的数据填充到page2中,并将page2整个页面返回到page1中ajax的回调函数. 一句话 ...
- session过期,拦截ajax请求并跳转登录页面
1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...
随机推荐
- 【Go】那么多数值类型,应该选哪个?
原文链接:https://blog.thinkeridea.com/201903/go/selection_of_numerical_types.html Go 内置很多种数值类型,往往初学者不知道编 ...
- 机器学习入门之python实现图片简单分类
小任务:实现图片分类 1.图片素材 python批量压缩jpg图片: PIL库 resize http://blog.csdn.net/u012234115/article/details/50248 ...
- XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea
A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...
- 两个排序链表的合并(Easy)
问题来源:选自leetcode 21:合并两个有序链表 问题描述: 题目给定信息: 给定两个有序链表,把两个链表合并成一个链表,并且合并后的链表依然是有序的.这两个链表中允许有重复元素 问题分析: 设 ...
- oracle12c
12c和11g环境是一样的,请参考前面 一.设置环境变量 vim /home/oracle/.bashrc ORACLE_BASE=/data/app/oracle ORACLE_HOME=$ORAC ...
- SSH集成(Struts+Spring+Hibernate)
环境:struts2.3.Xspring4.0.0hibernate4.2 思路:从下开始往上集成;层与层之间没有关系;在集成的时候,只关注当前集成的那个层的内容; 1,创建一个空的web项目;重新定 ...
- vim编辑器显示行号
Vim编辑器显示行号的设置 1. 显示行号 :set nu 2. 不显示行号 :set nonu :set nu :set nonu
- JMter随记
线程组( Threads (Users))理解:一个虚拟用户组,线程组内线程数量在运行过程中不会发生改变. 注意事项:线程间变量相互独立. 一个测试计划内可以包含多个线程组. 可定义内容: 取样器错误 ...
- PHP算法学习(6) 单向链表 实现栈
svn地址:svn://gitee.com/zxadmin/live_z 这个是模拟栈的先进后出的一个链表操作,自动维护链表,当然你也使用SPL的栈 测试版本php 5.4 ,5.6,7.0,7.2 ...
- ASP.NET Core 问题排查:Request.EnableRewind 后第一次读取不到 Request.Body
实际应用场景是将用户上传的文件依次保存到阿里云 OSS 与腾讯云 COS ,实现方式是在启用 Request.EnableRewind() 的情况下通过 Request.Body 读取流,并依次通过 ...