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里访问SharePoint列表数据的实现方法
May 22 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
Dec 04 Javascript
JavaScript实现基于Cookie的存储类实例
Apr 10 Javascript
javascript实现table表格隔行变色的方法
May 13 Javascript
javascript同步服务器时间和同步倒计时小技巧
Sep 24 Javascript
JavaScript简单遍历DOM对象所有属性的实现方法
Oct 21 Javascript
js 获取元素所有兄弟节点的实现方法
Sep 06 Javascript
JS中常用的消息框总结
Feb 24 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
在vue中使用echarts(折线图的demo,markline用法)
Jul 20 Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 Vue.js
一定要知道的 25 个 Vue 技巧
Nov 02 Vue.js
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/12/28 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
Zend Framework路由器用法实例详解
2016/12/11 PHP
PHP去除空数组且数组键名重置的讲解
2019/02/28 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
2017/08/04 jQuery
基于AngularJS的简单使用详解
2017/09/10 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
[02:45]DOTA2英雄敌法师基础教程
2013/11/25 DOTA
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Python 文件操作的详解及实例
2017/09/18 Python
pandas string转dataframe的方法
2018/04/11 Python
python实现俄罗斯方块
2018/06/26 Python
pytorch打印网络结构的实例
2019/08/19 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
应届生财务会计求职信
2013/11/05 职场文书
审核会计岗位职责
2013/11/08 职场文书
求职信范文英文版
2014/01/05 职场文书
法人代表任命书范本
2014/06/05 职场文书
校园绿化美化方案
2014/06/08 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
Python 把两层列表展开平铺成一层(5种实现方式)
2021/04/07 Python