移动端js模拟截屏生成图片并下载功能的实现方案
一、根据PM需求如下:
移动端wap 实现将二维码生成图片下载至用户手机相册保存
二、根据现有思路:
1、使用第三方工具html2canvas,将页面中指定范围的dom转换为canvas
2、随后使用canvas的apitoDataUrl获得base64格式的图片数据
3、此时试着直接用a标签下载
<a href="base64Url" download="name.jpg"></a>
三、经过尝试,发现在wap端无法完美实现,原因:
1、H5现有的 download 属性,不同浏览器的支持有差别,chrome 和 firefox是支持比较好的
2、前端js生成的时base64格式的图片数据,移动端无法直接下载,(pc端的chrome 和 firefox 貌似可以)
四、修正思路:
1、将base64转换成blob,再模拟一个表单对象,将blob放进去,使用post提交给后端
2、图片传输至后端保存,并返回图片服务器地址
3、拿到服务器地址后,再来尝试a标签下载:
4、根据手机系统,经过实测:
a、IOS系统UC上,直接打开了图片地址(如果图片地址与项目地址不同源,可能还会出现提示)
b、Android系统UC上,可以直接下载
5、优化IOS,放弃a标签的方案,变为添加一个弹出层,展示该图片,提示用户长按下载,至此比较完美的实现了该功能
参考:https://juejin.im/post/5c415691e51d45518d46eb9c
移动端js模拟截屏生成图片并下载功能的实现方案的更多相关文章
- js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题
项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...
- VB用API模拟截屏键PrintScreen
很多人用 SendKeys "{PRTSC}" 模拟截屏键 PrintScreen 的时候提示<错误:'70' 拒绝的权限>,于是经常遇到人问...干脆写下来 '声明 ...
- Snipaste强大离线/在线截屏软件的下载、安装和使用
步骤一: https://zh.snipaste.com/ ,去此官网下载. 步骤二:由于此是个绿色软件,直接解压即可. 步骤三:使用,见官网.ttps://zh.snipaste.com 按F1 ...
- JS 实现全屏预览 F11功能
老是不通过,没办法,只能是重新发布了,反正我就是杠上了,大大小小写过很多前端特效,当然也经常在网上copy或者修改人家的代码,我觉得也挺好的,为什么?!因为我想这样,你能怎么办,打我?少废话,直接上代 ...
- js a 标签 通过download 实现下载功能
download 属性规定被下载的超链接目标. 在 <a> 标签中必须设置 href 属性. 该属性也可以设置一个值来规定下载文件的名称.所允许的值没有限制,浏览器将自动检测正确的文件扩展 ...
- iOS检测用户截屏并获取所截图片
iOS检测用户截屏并获取所截图片 微信可以检测到用户截屏行为(Home + Power),并在稍后点击附加功能按钮时询问用户是否要发送刚才截屏的图片,这个用户体验非常好.在iOS7之前, 如果用户截屏 ...
- c# wpf 利用截屏键实现截屏功能
原文:c# wpf 利用截屏键实现截屏功能 最近做一个wpf程序需要截图功能,查找资料费了一些曲折,跟大家分享一下. 先是找到了这样一份代码: static class Scr ...
- unity之截屏功能
1.全屏截图 方法一:在unity的API中,unity给我们提供了一个现成的API : Application.CaptureScreenshot(imagename). 但是这个API虽然简单 ...
- 【转】Android 音量键+电源键 截屏代码小结
http://104zz.iteye.com/blog/1752961 原文地址:http://blog.csdn.net/hk_256/article/details/7306590 ,转载请注明出 ...
随机推荐
- ACMG遗传变异分类标准与指南
2015年,美国权威机构——美国医学遗传学与基因组学学会(ACMG)编写和发布了<ACMG遗传变异分类标准与指南>.为帮助我国医疗工作者和遗传咨询从业者更好地理解ACMG遗传变异分类标准. ...
- Qt532_字符编码转换
1.测试代码: // http://blog.csdn.net/changsheng230/article/details/6588447 QString str = QString::fromLoc ...
- Python mysql-表中数据的大量插入
2017-09-06 23:28:26 import pymysql db = pymysql.connect("localhost","root"," ...
- Java数组的定义和使用
如果希望保存一组有相同类型的数据,可以使用数组. 数组的定义和内存分配 Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName; type 为Java ...
- Silverlight自定义控件系列 – TreeView (4) 缩进
接下来是缩进,没有缩进的Tree怎么看都不顺眼. 首先,定义节点深度Depth(注:回叫方法暂没有代码,以后要用到): 1: /// <summary> 2: /// Using a De ...
- 013 - 关于GC root: Native Stack | MAT分析
Question: I have some third library code that I run and after some time I run into OutOfMemoryEr ...
- php--------删除一个路径下的所有文件夹和文件
php遍历一个文件夹内的所有文件和文件夹,并删除所有文件夹和子文件夹下的所有文件的代码,通过递归方式实现达到清空一个目录的效果,代码简单实用. 也适合在thinkphp中清理缓存,在thinkphp中 ...
- android--------Retrofit+RxJava的使用
Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库. http://square.github.io/retrofit/ https://github. ...
- 使用Laravel提交POST请求出现The page has expired due to inactivity错误
任何指向 web 中 POST, PUT 或 DELETE 路由的 HTML 表单请求都应该包含一个 CSRF 令牌(CSRF token),否则,这个请求将会被拒绝.
- Golang中defer、return、返回值之间执行顺序的坑
原文链接:https://studygolang.com/articles/4809 Go语言中延迟函数defer充当着 cry...catch 的重任,使用起来也非常简便,然而在实际应用中,很多go ...