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 相关文章推荐
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
Jan 09 Javascript
js浏览器本地存储store.js介绍及应用
May 13 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
Jul 09 Javascript
JavaScript数组对象赋值用法实例
Aug 04 Javascript
JS实现网页每隔3秒弹出一次对话框的方法
Nov 09 Javascript
jQuery插件编写步骤详解
Jun 03 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
Jun 15 Javascript
vue axios同步请求解决方案
Sep 29 Javascript
React操作真实DOM实现动态吸底部的示例
Oct 23 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
Sep 14 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
Nov 06 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
Mar 23 Javascript
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
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
php页面防重复提交方法总结
2013/11/25 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
一段实时更新的时间代码
2006/07/07 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
jquery+css实现的红色线条横向二级菜单效果
2015/08/22 Javascript
基于javascript实现简单的抽奖系统
2020/04/15 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
ES6 class的应用实例分析
2019/06/27 Javascript
小程序实现锚点滑动效果
2019/09/23 Javascript
JavaScript监听键盘事件代码实现
2020/06/03 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
Python获取单个程序CPU使用情况趋势图
2015/03/10 Python
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python中的super()方法使用简介
2015/08/14 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
python检测服务器端口代码实例
2019/08/31 Python
django ajax发送post请求的两种方法
2020/01/05 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
python是怎么被发明的
2020/06/15 Python
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
八年级作文之友情
2019/11/25 职场文书
详细谈谈MYSQL中的COLLATE是什么
2021/06/11 MySQL
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android
解析redis hash应用场景和常用命令
2021/08/04 Redis