function displayHtmlWithImageStream(bodyHtml) {

var imgReg = /<img.*?(?:>|\/>)/gi;

var arr = bodyHtml.match(imgReg);

if (arr != null) {

for (var i = 0; i < arr.length; i++) {

replaceImageUrlWithStream(bodyHtml, arr, i);

}

}

}

function replaceImageUrlWithStream(bodyHtml, arr, i) {

$scope.body = bodyHtml;

var images = arr[i];

var srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i;

var src = images.match(srcReg);

var url = src[1];

var type = 'image/' + url.split('.').pop();

var imgDataObject = {};

assetHelper.getAsset(url, imgDataObject, getAssetSuccess, getAssetError);

function getAssetSuccess(data) {

var imgDataUrl = data.url;

$scope.body = $scope.body.replace(url, 'data:' + type + ';base64,' + imgDataUrl);

}

}

function getAssetError(url, reason) {

$scope.body = $scope.body.replace(url, '#');

}

function getAsset(url, assetModel, success, fail) {

serviceBase.get({ url: url, responseType: 'arraybuffer' })

.success(function (response) {

assetModel.url = base64ArrayBuffer(response);

success(assetModel);

})

.error(function (url, reason) {

fail(url, reason);

});

}

// Converts an ArrayBuffer directly to base64, without any intermediate 'convert to string then

// use window.btoa' step. According to my tests, this appears to be a faster approach:

// http://jsperf.com/encoding-xhr-image-data/5

function base64ArrayBuffer(arrayBuffer) {

var base64 = '';

var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

var bytes = new Uint8Array(arrayBuffer);

var byteLength = bytes.byteLength;

var byteRemainder = byteLength % 3;

var mainLength = byteLength - byteRemainder;

var a, b, c, d;

var chunk;

// Main loop deals with bytes in chunks of 3

for (var i = 0; i < mainLength; i = i + 3) {

// Combine the three bytes into a single integer

chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];

// Use bitmasks to extract 6-bit segments from the triplet

a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18

b = (chunk & 258048) >> 12; // 258048   = (2^6 - 1) << 12

c = (chunk & 4032) >> 6; // 4032     = (2^6 - 1) << 6

d = chunk & 63;               // 63       = 2^6 - 1

// Convert the raw binary segments to the appropriate ASCII encoding

base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];

}

// Deal with the remaining bytes and padding

if (byteRemainder == 1) {

chunk = bytes[mainLength];

a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2

// Set the 4 least significant bits to zero

b = (chunk & 3) << 4; // 3   = 2^2 - 1

base64 += encodings[a] + encodings[b] + '==';

} else if (byteRemainder == 2) {

chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1];

a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10

b = (chunk & 1008) >> 4; // 1008  = (2^6 - 1) << 4

// Set the 2 least significant bits to zero

c = (chunk & 15) << 2; // 15    = 2^4 - 1

base64 += encodings[a] + encodings[b] + encodings[c] + '=';

}

return base64;

}

用JS获取Html中所有图片文件流然后替换原有链接的更多相关文章

  1. js获取URL中的参数

    js获取URL中的一些参数的意思 location对象 含有当前URL的信息. 属性 href 整个URL字符串. protocol 含有URL第一部分的字符串,如http: host 包含有URL中 ...

  2. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  3. js获取jsp中的变量值

    js获取jsp中的变量值,有两种方式: 1.jsp标签获取属性 var message = '<%=request.getAttribute("message")%>' ...

  4. js 获取url中的参数 修改url 参数 移除url参数

    js 获取url中的参数 修改url 参数 移除url参数 var jsUrlHelper = { getUrlParam : function(url, ref) { var str = " ...

  5. 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

    [源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...

  6. js获取url中参数名也参数值

    要撮利用js获取url中参数名也参数值这个不多见了,但我今天需要这样操作,下面我来给大家介绍一下具体的实例方法.   在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到. js的实现方法如下 ...

  7. js获取url中的参数,并保证获取到的参数不乱码

    //网上比较经典的js获取url中的参数的方法 function getQueryString(name) { var reg = new RegExp("(^|&)" + ...

  8. 【2017-06-29】在登录页面自动返回上次请求页面、Js获取table中的行数与列数

    一.在登录页面自动返回上次请求页面 Request.UrlReferrer比如 if (Request.UrlReferrer != null) { //如果能获取来路地址 Response.Redi ...

  9. JS基础入门篇( 三 )—使用JS获取页面中某个元素的4种方法以及之间的差别( 一 )

    1.使用JS获取页面中某个元素的4种方法 1.通过id名获取元素 document.getElementById("id名"); 2.通过class名获取元素 document.g ...

随机推荐

  1. laya在微信小游戏中加载BitmapFont失效的问题

    发布为微信小游戏后,在微信工具中测试时总是提示加载retry to load TheRed.fnt,并以error告终.由于没有任何出错信息,无奈之下只好阅读源码.对BitmapFont的处理分为两个 ...

  2. VC++编译说明

    目录 第1章编译步骤    1 第2章编译源文件    2 2.1 编译器    2 2.2 包含头文件    3 2.3 重复包含    6 2.4 预编译头文件    7 2.4.1 创建     ...

  3. 奶牛排序——RMQ

    [问题描述]奶牛在熊大妈的带领下排成了一条直队.显然,不同的奶牛身高不一定相同……现在,奶牛们想知道,如果找出一些连续的奶牛,要求最左边的奶牛 A 是最矮的,最右边的 B 是最高的,且 B 高于 A ...

  4. web.xml配置之<context-param>

    <context-param>的作用和用法: 1.<context-param>配置是是一组键值对,比如: <context-param>        <p ...

  5. CMake 手册详解(二十)

    SirDigit CMake 手册详解(二十) CMD#51: list 列表操作命令. list(LENGTH <list> <output variable>) list( ...

  6. centos7命令行模式安装&&配置_br0+kvm+虚拟机+添加硬盘+快照及恢复

    KVM创建虚拟机步骤 Submitted by zhaoley on October 18, 2016 - 10:43am 测试环境: 1: 43.243.130.89, CentOS Linux r ...

  7. Programming With Objective-C---- Encapsulating Data ---- Objective-C 学习(三) 封装数据

      Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in t ...

  8. Git分布式版本控制工具

    一.安装Git  1.下载Windows版的Git:msysgit:官方下载地址:http://msysgit.github.io,安装选定要安装的目录(路径杜绝中文),剩下的按照默认安装即可,参考: ...

  9. 20170407-ms

    invoke v调用 dismiss v解雇   exclusive adj. 专用的; 高级的; 排外的; 单独的;  n. 独家新闻; 专有物; 独家经营的产品(或项目.设计等); 排外者; ex ...

  10. python 模块和包的使用方法

    一.模块 1.import导入模块 import module1,mudule2... 2.from...import...导入模块 导入指定内容 from modname import name1[ ...