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 相关文章推荐
倒记时60刷新网页的js代码
Feb 18 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
解决vue 更改计算属性后select选中值不更改的问题
Mar 02 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
jQuery表单元素过滤选择器用法实例分析
Feb 20 jQuery
uni-app 组件里面获取元素宽高的实现
Dec 27 Javascript
JavaScript对象属性操作实例解析
Feb 04 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
Mar 07 Javascript
JavaScript交换变量常用4种方法解析
Sep 02 Javascript
javascript使用正则表达式实现注册登入校验
Sep 23 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 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实现批量修改文件后缀名的方法
2015/07/30 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
ExtJS 2.0实用简明教程 之Border区域布局
2009/04/29 Javascript
js 静态动态成员 and 信息的封装和隐藏
2011/05/29 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
JavaScript获取中英文混合字符串长度的方法示例
2017/02/04 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
微信小程序实现简单input正则表达式验证功能示例
2017/11/30 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Django实现组合搜索的方法示例
2018/01/23 Python
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python try except 捕获所有异常的实例
2018/10/18 Python
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
HealthElement海外旗舰店:新西兰大卖场
2018/02/23 全球购物
php优化查询foreach代码实例讲解
2021/03/24 PHP
幼儿园教师考核制度
2014/02/01 职场文书
业务员自荐信范文
2014/04/20 职场文书
食品安全标语
2014/06/07 职场文书
政审证明材料
2015/06/19 职场文书
交通安全温馨提示语
2015/07/14 职场文书
2016寒假假期总结
2015/10/10 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL