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 相关文章推荐
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
JavaScript浮点数及运算精度调整详解
Oct 21 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
js querySelector() 使用方法
Dec 21 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
Dec 16 Javascript
Angular17之Angular自定义指令详解
Jan 21 Javascript
express启用https使用小记
May 21 Javascript
Vue 动态组件components和v-once指令的实现
Aug 30 Javascript
JS实现使用POST方式发送请求
Aug 30 Javascript
原生js实现日期选择插件
May 21 Javascript
JavaScript类的继承多种实现方法
May 30 Javascript
详解JS ES6编码规范
May 07 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实现PDO的mysql数据库操作类
2014/12/12 PHP
php依赖注入知识点详解
2019/09/23 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
JS小框架 fly javascript framework
2009/11/26 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
使用jquery提交form表单并自定义action的方法
2016/05/25 Javascript
深入浅析JS Function()构造函数
2016/08/22 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
浅析Ajax语法
2016/12/05 Javascript
原生js实现放大镜特效
2017/03/08 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
python pdb调试方法分享
2014/01/21 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python构建XML树结构的方法示例
2017/06/30 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python程序变成软件的实操方法
2019/06/24 Python
Django 接收Post请求数据,并保存到数据库的实现方法
2019/07/12 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
加工操作管理制度
2014/01/19 职场文书
校企合作协议书
2014/04/16 职场文书
爱心捐助活动总结
2015/05/09 职场文书