整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

html5复制黏贴上传图片

天在博客中加了个新的功能,直接复制图片然后黏贴上传到服务器。

之前是自己弄的markdown编辑器,很多功能不完善,刚开始加了个插入图片的按钮,现在能直接复制图片方便多了。

目前只支持chrome浏览器,哈哈,感觉chrome是最好用的浏览器。

主要原理是利用paste事件,然后拿到里面的图片数据上传到服务器。

下面贴代码

<textarea id="content" />

有个编辑的文本框,然后监听parse事件

document.querySelector('#content').addEventListener('paste', function(event) {

var isChrome = false;

if (event.clipboardData || event.originalEvent) {

//not for ie11 某些chrome版本使用的是event.originalEvent

var clipboardData = (event.clipboardData || event.originalEvent.clipboardData);

if (clipboardData.items) {

// for chrome

var items = clipboardData.items, len = items.length, blob = null;

isChrome = true;

for (var i = 0; i < len; i++) {

if (items[i].type.indexOf("image") !== -1) {

//getAsFile() 此方法只是living standard firefox ie11 并不支持

blob = items[i].getAsFile();

}

ileReader 对象FileReader 对象主要用来把文件读入内存,并且读取文件中的数据。通过构造函数创建一个 FileReader 对象。

这个文件读取对象有以下几种方法:

1.readAsText():读取文本文件(可以使用Txt打开的文件),返回文本字符串,默认编码是UTF-8。


2.readAsBinaryString():读取任意类型的文件。返回二进制字符串。这个方法不是用来读取文件展示给用户看,而是存储文件。例如:读取文件的内容,获取二进制数据,传递给后台,后台接收了数据之后,再将数据存储。


3.readAsDataURL():读取文件获取一段以data开头的字符串,这段字符串的本质就是DataURL.DataURL是一种将文件(这个文件一般就是指图像或者能够嵌入到文档的文件格式)嵌入到文档的方案。DataURL是将资源转换为base64编码的字符串形式,并且将这些内容直接存储在url中>>优化网站的加载速度和执行效率。


4.abort():中断读取

该对象常见应用在即时预览:

即时:当用户选择完图片之后就立刻进行预览的处理 >>onchange。

预览:通过文件读取对象的readAsDataURL()完成。

以下是应用时的具体实现(推荐了解黑马程序员web前端培训课程)

HTML部分:

JS部分:

其中获取数据时,FileReader还提供一个完整的事件模型,用来捕获读取文件时的状态。

onabort:读取文件中断片时触发

onerror:读取错误时触发

onload:文件读取成功完成时触发

onloadend:读取完成时触发,无论成功还是失败

onloadstart:开始读取时触发

onprogress:读取文件过程中持续触发

谢 DCloud 社区原作者(1091656813@qq.com:http://ask.dcloud.net.cn/article/13494),本人做了一点代码精简。

简单说下 HTML5Plus,与 Cordova(含 ionic)类似,是 js 写了中间层协议,使得打包在 APP 中的 webview 组件可以通过暴露出来的 api 接口调用原生的能力,比如页面栈控制,拍照等等。

适用于快速原型开发 APP,性能要求不是那么高的 APP 开发(90% 的 APP 性能要求都是够的)。

优点:超级简单,是个前端就能做 APP,这一条就够了!

缺点:1. 依赖自家 IDE,之前是 HBuilder,现在推新版 HBuilderX(Vue 官网也投放了广告);2. 社区环境差,非大厂不开源基本都这样(好在自家迭代还算迅速);3. 自家 UI 框架用的还是 iOS 样式,万年更新一次……

对了,附带一个小 tip:iOS 上架的 APP 必须有调用 iOS 系统接口的操作(哪怕仅仅是陀螺仪),否则被拒。Android 同样建议如此。


牵扯功能

  1. BitMap 对象截屏
  2. 在 BitMap 对象截屏回调中保存到相册(需要同意授权)

Show Me Code

// 默认截屏全屏
const obj = {
 top: '0px',
 left: '0px',
 width: '100%',
 height: '100%'
}
// 动态获取时间作为文明标识
function getDateStr() {
 return String(Date.parse(new Date()));
}
/**
 * @params {function} successCB 必填的成功回调
 * @params {function} errorCB 失败回调
 * @params {string} fileName 文件名
 * @params {string} imgID 图片 id
 * @params {boolean} overwrite 是否覆盖已有文件
 * @params {string} format 格式
 * @params {number} quality 成图质量
 * @params {object} clip 截屏区域
 */
function save(successCB, errorCB = () => {}, fileName = getDateStr(), imgID = getDateStr(),
 overwrite = true, format = 'png', quality = 50, clip = obj) {
 const cw = plus.webview.currentWebview();
 const bitmap = new plus.nativeObj.Bitmap(imgID);
 //绘制截图
 cw.draw(bitmap, function() {
 // 保存Bitmap图片
 bitmap.save('_doc/' + fileName + '.' + format, {
 overwrite,
 format,
 quality,
 clip
 }, function(i) {
 //保存到系统相册
 plus.gallery.save(i.target, function(details) {
 //销毁Bitmap图片
 bitmap.clear();
 successCB({
 success: 'success',
 details,
 });
 }, function(e) {
 //销毁Bitmap图片
 bitmap.clear();
 errorCB({
 error: '图片保存至相册失败',
 details: e
 });
 });
 }, function(e) {
 bitmap.clear();
 errorCB({
 error: '图片保存失败',
 details: e
 });
 });
 }, function(e) {
 errorCB({
 error: '截屏绘制失败',
 details: e
 });
 });
}
// 调用保存
function clickSave() {
 save(function() {
 alert('保存成功,请前往相册分享');
 })
}

都已经在注释里面,拿来即用。


建议接触 HTML5Plus 的同学保存一份,以备不时之需。

这个是这两天遇到的小 tip,希望帮到你。谢谢。