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 相关文章推荐
HTML中的setCapture和releaseCapture使用介绍
Mar 21 Javascript
js获取TreeView控件选中节点的Text和Value值的方法
Nov 24 Javascript
Three.js源码阅读笔记(基础的核心Core对象)
Dec 27 Javascript
jQuery提交多个表单的小例子
Jun 30 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
jquery Form轻松实现文件上传
May 24 jQuery
使用bootstraptable插件实现表格记录的查询、分页、排序操作
Aug 06 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
React Native react-navigation 导航使用详解
Dec 01 Javascript
基于js 各种排序方法和sort方法的区别(详解)
Jan 03 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
May 08 Javascript
JS实现电商商品展示放大镜特效
Jan 07 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检测url是否存在的方法
2015/04/14 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
js 如何实现对数据库的增删改查
2012/11/23 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
js实现延迟加载的方法
2015/06/24 Javascript
JS设置下拉列表框当前所选值的方法
2015/12/22 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
js document.getElementsByClassName的使用介绍与自定义函数
2016/11/25 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
微信小程序 引入es6 promise
2017/04/12 Javascript
基于canvas粒子系统的构建详解
2017/08/31 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
深入理解JavaScript的async/await
2018/08/05 Javascript
bootstrap select2插件用ajax来获取和显示数据的实例
2018/08/09 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
python中的yield使用方法
2014/02/11 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
英国经典球衣网站:Classic Football Shirts
2017/05/20 全球购物
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
linux下进程间通信的方式
2013/01/23 面试题
自我鉴定怎么写
2013/12/05 职场文书
详细的大学生创业计划书模板
2014/01/27 职场文书
顶碗少年教学反思
2014/02/21 职场文书
五四青年节的活动方案
2014/08/20 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
公司市场部岗位职责
2015/04/15 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
初三数学教学反思
2016/02/17 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang