JavaScript实现异步图像上传功能


Posted in Javascript onJuly 12, 2018

当向服务器上传图像时,根据服务器操作的复杂性和服务器性能,需要几秒钟到几分钟的时间来完成。本文的重点是在图像上传至服务器时使用JavaScript立即显示图像。

介绍

当使用JavaScript将图像上传到服务器时,根据服务器操作的复杂性,可能需要几秒到几分钟来完成操作。在某些情况下,即使图像上传成功,也需要花费更多的时间,这取决于服务器对图像进行额外处理的能力。

本文展示了一种使用代码示例立即显示图像的方法(使用图像的Base64编码版本),同时将其上载到服务器,而无需等待操作完成。这种方法的目的是提高web应用程序的用户体验,而不等待服务器做整个图像的处理(例如,缩略图生成、应用过滤器等)后,上传成功,因为它可以在客户端web应用程序上展示图片。

JavaScript实现异步图像上传功能 

背景

在使用AWS S3作为图像存储时,最初遇到了这个问题。图像缩略图的设置是使用AWS Lambda完成的,在使用web应用程序的JavaScript成功上传图像到S3之后,S3将异步触发AWS Lambda函数,该函数将生成图像的缩略图并将其存储在另一个S3中。尽管这是一个高度可伸缩和可靠的图像缩略图生成解决方案,但是web应用程序要等到生成缩略图才能在应用程序的视图中显示它,这是不现实的。

使用的代码

此代码使用VanillaJS编写,不使用任何第三方JavaScript库,因此如果您使用任何第三方框架,您可以使用框架或库提供的构造来调整概念并实现它。

步骤1:将图像加载到浏览器

JavaScript实现异步图像上传功能 

如图所示在上面的例子中,有两个HTML元素的例子。< img > DOM元素有显示选中的图像。<input> DOM元素为用户选择图像文件。使用JavaScript文件API,可以听改变事件处理程序和加载图像访问使用JavaScript。

步骤2:生成Base64缩略图

JavaScript实现异步图像上传功能 

使用JavaScript访问图像后,将其加载到HTML5 FileReader并转换为Base64数据URL。然后使用Base64数据URL更新 DOM元素。

步骤3:使用Ajax上传文件

JavaScript实现异步图像上传功能

JavaScript实现异步图像上传功能

使用Ajax,图像上传被启动到服务器。使用JavaScript, HTML表单提交将异步触发,具体的代码将根据服务器实现而异,特别是在HTTP方法(例如,这里是POST)和URL方面。

如果服务器响应包含图像URL,则可以使用它相应地更新 DOM元素,或者如果服务器维护了适当的图像访问路径约定(例如,/images/),则可以使用它加载图像。

步骤4:(可选)客户端缩略图生成

<!DOCTYPE html> 
<html> 
<body> 
<input type="file" id="imageFileInput" accept=".jpg, .jpeg, .png" /> 
<img src="//:0" id="preview" /> 
<script> 
document.getElementById('imageFileInput').addEventListener('change', function() { 
var img = this.files[0]; 
uploadImage(img, '/image/upload', function(url) { 
// Image upload to server response 
// Show the image using setImageUrl(URL) 
}); 
getBase64ImageUrl(img, function(base64ImageUrl) { 
var height = 100, 
width = 100; 
getThumbnail(base64ImageUrl, height, width, function(base64ThumbnailUrl) { 
setImageUrl(base64ThumbnailUrl); 
}) 
}); 
}, false); 
function setImageUrl(url) { 
document.getElementById('preview').setAttribute('src', url); 
}; 
function uploadImage(img, url, callback) { 
var xhr = new XMLHttpRequest(); 
var fd = new FormData(); 
xhr.open("POST", url, true); 
xhr.onreadystatechange = function() { 
if (xhr.readyState == 4 && xhr.status == 200) { 
 callback && callback(xhr.responseText); 
} 
}; 
fd.append("upload_image", img); 
xhr.send(fd); 
}; 
function getBase64ImageUrl(img, callback) { 
var reader = new FileReader(); 
reader.readAsDataURL(img); 
reader.onload = function() { 
callback && callback(reader.result); 
}; 
reader.onerror = function(error) { 
console.log('Error: ', error); 
}; 
}; 
function getThumbnail(base64ImageUrl, height, width, callback) { 
var canvas = document.createElement('canvas'); 
var ctx = canvas.getContext("2d"); 
var image = new Image(); 
image.src = base64ImageUrl; 
image.onload = function() { 
ctx.drawImage(image, 0, 0, width, height); 
callback && callback(canvas.toDataURL()); 
}; 
} 
</script> 
</body> 
</html>

总结

以上所述是小编给大家介绍的JavaScript实现异步图像上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jquery索引在使用中的一些困惑
Oct 24 Javascript
jquery中常用的函数和属性详细解析
Mar 07 Javascript
html的DOM中document对象anchors集合用法实例
Jan 21 Javascript
JavaScript设置表单上传时文件个数的方法
Aug 11 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
微信小程序 textarea 组件详解及简单实例
Jan 10 Javascript
js监听input输入框值的实时变化实例
Jan 26 Javascript
原生JS实现垂直手风琴效果
Feb 19 Javascript
jQuery中的deferred使用方法
Mar 27 jQuery
Vue-cli项目获取本地json文件数据的实例
Mar 07 Javascript
JavaScript实现短暂提示框功能
Apr 04 Javascript
8个非常实用的Vue自定义指令
Dec 15 Vue.js
Angular4 组件通讯方法大全(推荐)
Jul 12 #Javascript
vue移动端轻量级的轮播组件实现代码
Jul 12 #Javascript
详解node.js的http模块实例演示
Jul 12 #Javascript
Vue中使用的EventBus有生命周期
Jul 12 #Javascript
JavaScript中发出HTTP请求最常用的方法
Jul 12 #Javascript
vue实现引入本地json的方法分析
Jul 12 #Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 #jQuery
You might like
Mysql数据库操作类( 1127版,提供源码下载 )
2010/12/02 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
详解webpack分包及异步加载套路
2017/06/29 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
使用Vue写一个datepicker的示例
2018/01/27 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
深入理解Python对Json的解析
2017/02/14 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
Android基于TCP和URL协议的网络编程示例【附demo源码下载】
2018/01/23 Python
Python中IP地址处理IPy模块的方法
2019/08/16 Python
详解Python图像处理库Pillow常用使用方法
2019/09/02 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
python实现斗地主分牌洗牌
2020/06/22 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
3个CCIE对一个工程师的面试题
2012/05/06 面试题
配置管理计划的主要内容有哪些
2014/06/20 面试题
运动会领导邀请函
2014/02/05 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
学校通报表扬范文
2015/05/04 职场文书
心术观后感
2015/06/11 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
Redis+AOP+自定义注解实现限流
2022/06/28 Redis