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 相关文章推荐
拖动一个HTML元素
Dec 22 Javascript
javascript onkeydown,onkeyup,onkeypress,onclick,ondblclick
Feb 04 Javascript
ExtJS 2.0实用简明教程 之获得ExtJS
Apr 29 Javascript
[原创]js获取数组任意个不重复的随机数组元素
Mar 15 Javascript
网页中CDATA标记的说明
Sep 12 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
Jul 09 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
Aug 01 Javascript
基于AngularJS前端云组件最佳实践
Oct 20 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 Javascript
node.js实现带进度条的多文件上传
Mar 27 Javascript
微信小程序webSocket的使用方法
Feb 20 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在apache环境下实现gzip配置方法
2015/04/02 PHP
laravel中短信发送验证码的实现方法
2018/04/25 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
在Docker快速部署Node.js应用的详细步骤
2016/09/02 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
微信小程序开发问题之wx.previewImage
2018/12/25 Javascript
JavaScript设计模式之观察者模式实例详解
2019/01/16 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Win10下Python环境搭建与配置教程
2016/11/18 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
美国女性卫生用品公司:Thinx
2017/06/30 全球购物
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
shallow copy和deep copy的区别
2016/05/09 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
优秀中学生事迹材料
2014/01/31 职场文书
租房协议书怎么写
2014/04/10 职场文书
软件项目实施计划书
2014/05/02 职场文书
2014年反洗钱工作总结
2014/11/22 职场文书
服务明星事迹材料
2014/12/29 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
《我要的是葫芦》教学反思
2016/02/18 职场文书
Python 制作自动化翻译工具
2021/04/25 Python