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 相关文章推荐
Javascript select下拉框操作常用方法
Nov 09 Javascript
js获取客户端外网ip的简单实例
Nov 21 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
js实现登陆遮罩效果的方法
Jul 28 Javascript
JS数组去重(4种方法)
Mar 27 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
详解vue.js数据传递以及数据分发slot
Jan 20 Javascript
详解webpack运行Babel教程
Jun 13 Javascript
layui 设置table 行的高度方法
Aug 17 Javascript
angularjs请求数据的方法示例
Aug 06 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
基于JQuery的一句代码实现表格的简单筛选
2010/07/26 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
2012/09/14 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JQuery对表格进行操作的常用技巧总结
2014/04/23 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
Javascript实现跑马灯效果的简单实例
2016/05/31 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
localStorage实现便签小程序
2016/11/28 Javascript
RequireJs的使用详解
2017/02/19 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
关于Flask项目无法使用公网IP访问的解决方式
2019/11/19 Python
python3爬取torrent种子链接实例
2020/01/16 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
丝芙兰美国官网:SEPHORA美国
2016/08/03 全球购物
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
今冬明春火灾防控工作方案
2014/05/29 职场文书
会展策划与管理专业求职信
2014/06/09 职场文书
语文复习计划
2015/01/19 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书