javascript html5移动端轻松实现文件上传


Posted in Javascript onMarch 27, 2020

PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现。

用的技术主要是:

  • ajax
  • FileReader
  • FormData

HTML结构:

<div class="camera-area">
 <form enctype="multipart/form-data" method="post">
 <input type="file" name="fileToUpload" class="fileToUpload" accept="image/*" capture="camera"/>
 <div class="upload-progress"><span></span></div>
 </form>
 <div class="thumb"></div>
 </div>

已经封装好的upload.js,依赖zepto

(function($) {
 $.extend($.fn, {
 fileUpload: function(opts) {
 this.each(function() {
 var $self = $(this);
 var doms = {
 "fileToUpload": $self.find(".fileToUpload"),
 "thumb": $self.find(".thumb"),
 "progress": $self.find(".upload-progress")
 };
 var funs = {
 //选择文件,获取文件大小,也可以在这里获取文件格式,限制用户上传非要求格式的文件
 "fileSelected": function() {
 var files = (doms.fileToUpload)[0].files;
 var count = files.length;
 for (var index = 0; index < count; index++) {
 var file = files[index];
 var fileSize = 0;
 if (file.size > 1024 * 1024)
 fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
 else
 fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
 }
 funs.uploadFile();
 },
 //异步上传文件
 uploadFile: function() {
 var fd = new FormData();//创建表单数据对象
 var files = (doms.fileToUpload)[0].files;
 var count = files.length;
 for (var index = 0; index < count; index++) {
 var file = files[index];
 fd.append(opts.file, file);//将文件添加到表单数据中
 funs.previewImage(file);//上传前预览图片,也可以通过其他方法预览txt
 }
 var xhr = new XMLHttpRequest();
 xhr.upload.addEventListener("progress", funs.uploadProgress, false);//监听上传进度
 xhr.addEventListener("load", funs.uploadComplete, false);
 xhr.addEventListener("error", opts.uploadFailed, false);
 xhr.open("POST", opts.url);
 xhr.send(fd);
 },
 //文件预览
 previewImage: function(file) {
 var gallery = doms.thumb;
 var img = document.createElement("img");
 img.file = file;
 doms.thumb.html(img);
 // 使用FileReader方法显示图片内容
 var reader = new FileReader();
 reader.onload = (function(aImg) {
 return function(e) {
 aImg.src = e.target.result;
 };
 })(img);
 reader.readAsDataURL(file);
 },
 uploadProgress: function(evt) {
 if (evt.lengthComputable) {
 var percentComplete = Math.round(evt.loaded * 100 / evt.total);
 doms.progress.html(percentComplete.toString() + '%');
 }
 },
 "uploadComplete": function(evt) {
 alert(evt.target.responseText)
 }
 };
 doms.fileToUpload.on("change", function() {
 doms.progress.find("span").width("0");
 funs.fileSelected();
 });
 });
 }
 });
})(Zepto);

调用方法:

$(".camera-area").fileUpload({
 "url": "savetofile.php",
 "file": "myFile"
 });

PHP部分:

<?php
if (isset($_FILES['myFile'])) {
 // Example:
 writeLog($_FILES);
 move_uploaded_file($_FILES['myFile']['tmp_name'], "uploads/" . $_FILES['myFile']['name']);
 echo 'successful';
}
function writeLog($log){
 if(is_array($log) || is_object($log)){
 $log = json_encode($log);
 }
 $log = $log."\r\n";

 file_put_contents('log.log', $log,FILE_APPEND);
}
?>

更多精彩内容请参考专题《ajax上传技术汇总》,《javascript文件上传操作汇总》和《jQuery上传操作汇总》进行学习。

希望本文所述对大家学习有所帮助。

Javascript 相关文章推荐
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
js模拟select下拉菜单控件的代码
May 08 Javascript
Javascript基础教程之JavaScript语法
Jan 18 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
jQuery实现二维码扫描功能
Jan 09 Javascript
原生和jQuery的ajax用法详解
Jan 23 Javascript
详解原生js实现offset方法
Jun 15 Javascript
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
Vue开发之封装上传文件组件与用法示例
Apr 25 Javascript
es6数组的flat(),flatMap()函数用法实例分析
Apr 18 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
Jul 19 Javascript
javascript事件绑定学习要点
Mar 09 #Javascript
js实现分割上传大文件
Mar 09 #Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
Mar 09 #Javascript
基于jQuery的网页影音播放器jPlayer的基本使用教程
Mar 08 #Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
Mar 08 #Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
Mar 08 #Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 #Javascript
You might like
一个很不错的PHP翻页类
2009/06/01 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
2012/07/02 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
php桥接模式应用案例分析
2019/10/23 PHP
jquery对象和DOM对象的区别介绍
2013/08/09 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
Ionic快速安装教程
2016/06/03 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
js继承实现方法详解
2016/12/16 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
python 中字典嵌套列表的方法
2018/07/03 Python
python得到电脑的开机时间方法
2018/10/15 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
小学后勤管理制度
2014/01/14 职场文书
校园十佳歌手策划书
2014/01/22 职场文书
房地产促销活动方案
2014/03/01 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
房屋登记授权委托书范本
2014/10/09 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
单位推荐信范文
2015/03/27 职场文书
退货证明模板
2015/06/23 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
PHP使用非对称加密算法RSA
2021/04/21 PHP
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js