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 ajax提交表单数据的两种方式
Nov 24 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
Sep 05 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
Apr 06 Javascript
详解AngularJS Filter(过滤器)用法
Dec 28 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
JS中artdialog弹出框控件之提交表单思路详解
Apr 18 Javascript
JavaScript的Vue.js库入门学习教程
May 23 Javascript
使用JavaScript为一张图片设置备选路径的方法
Jan 04 Javascript
VUE中的无限循环代码解析
Sep 22 Javascript
手动用webpack搭建第一个ReactApp的示例
Apr 11 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 批量删除数据的方法分析
2009/10/30 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
如何利用PHP实现上传图片功能详解
2020/09/24 PHP
在修改准备发的批量美化select+可修改select时,在非IE下发现了几个问题
2007/01/09 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
JavaScript中的闭包
2016/02/24 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
jQuery制作图片旋转效果
2017/02/02 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
2018/02/27 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
vue使用laydate时间插件的方法
2018/11/14 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
在vue项目中利用popstate处理页面返回的操作介绍
2020/08/06 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
Python3 Random模块代码详解
2017/12/04 Python
使用python实现knn算法
2017/12/20 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
python中time.ctime()实例用法
2021/02/03 Python
python元组拆包实现方法
2021/02/28 Python
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
创建索引时需要注意的事项
2013/05/13 面试题
高一英语教学反思
2014/01/22 职场文书
含预算的公司户外活动方案
2014/08/16 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
Django migrate报错的解决方案
2021/05/20 Python