博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
H5图片上传插件
阅读量:7251 次
发布时间:2019-06-29

本文共 6282 字,大约阅读时间需要 20 分钟。

基于zepto,支持多文件上传,进度和图片预览,用于手机端。

(function ($) {    $.extend($, {        fileUpload: function (options) {            var para = {                multiple: true,                filebutton: ".filePicker",                uploadButton: null,                url: "/home/MUploadImg",                filebase: "mfile",//mvc后台需要对应的名称                auto: true,                previewZoom: null,                uploadComplete: function (res) {                    console.log("uploadComplete", res);                },                uploadError: function (err) {                    console.log("uploadError", err);                },                onProgress: function (percent) {  // 提供给外部获取单个文件的上传进度,供外部实现上传进度效果                    console.log(percent);                },            };            para = $.extend(para, options);            var $self = $(para.filebutton);            //先加入一个file元素            var multiple = "";  // 设置多选的参数            para.multiple ? multiple = "multiple" : multiple = "";

              $self.css('position', 'relative');

              $self.append('<input id="fileImage" style="opacity:0;position:absolute;top: 0;left: 0;width:100%;height:100%" type="file" size="30" name="fileselect[]" ' + multiple + '>');

var doms = {                "fileToUpload": $self.parent().find("#fileImage"),                // "thumb": $self.find(".thumb"),                // "progress": $self.find(".upload-progress")            };            var core = {                fileSelected: function () {                    var files = (doms.fileToUpload)[0].files;                    var count = files.length;                    console.log("共有" + count + "个文件");                    for (var i = 0; i < count; i++) {                        var item = files[i];                        console.log(item.size);                        if (para.auto) {                            core.uploadFile(item);                        }                        core.previewImage(item);                    }                },                uploadFile: function (file) {                    console.log("开始上传");                    var formdata = new FormData();                    formdata.append(para.filebase, file);//这个名字要和mvc后台配合                    var xhr = new XMLHttpRequest();                    xhr.upload.addEventListener("progress", function (e) {                        var percentComplete = Math.round(e.loaded * 100 / e.total);                        para.onProgress(percentComplete.toString() + '%');                    });                    xhr.addEventListener("load", function (e) {                        para.uploadComplete(xhr.responseText);                    });                    xhr.addEventListener("error", function (e) {                        para.uploadError(e);                    });                    xhr.open("post", para.url, true);                    //xhr.setRequestHeader("X_FILENAME", file.name);                    xhr.send(formdata);                },                uploadFiles: function () {                    var files = (doms.fileToUpload)[0].files;                    for (var i = 0; i < files.length; i++) {                        core.uploadFile(files[i]);                    }                },                previewImage: function (file) {                    if (!para.previewZoom) return;                    var img = document.createElement("img");                    img.file = file;                    $(para.previewZoom).append(img);                    // 使用FileReader方法显示图片内容                    var reader = new FileReader();                    reader.onload = (function (aImg) {                        return function (e) {                            aImg.src = e.target.result;                        };                    })(img);                    reader.readAsDataURL(file);                }            }            doms.fileToUpload.on("change", function () {                //doms.progress.find("span").width("0");                console.log("选中了文件");                core.fileSelected();            });            console.log("初始化!");            //绑定事件            $(document).on("click", para.filebutton, function () {                console.log("clicked");                //doms.fileToUpload.click();            });            if (para.uploadButton) {                $(document).on("click", para.uploadButton, function () {                    core.uploadFiles();                });            }        }    });})(Zepto);

简单讲解:上传还是得靠file元素,所以一开始就加了个隐藏的,简单隐藏会有一些问题,有时候不能触发file change事件。所以用了透明度,将父类设置为相对位置。然后通过file的change事件获得需要上传的文件并放入formdata中,再使用xmlHttpRequest发请求。进度条是直接绑定的process事件。文件预览是filereader,另外需要注意的就是filebase参数,对应的是MVC后台上传方法的参数的名称,如果不一致,后台将获取不到file。回调函数就不说了。

[HttpPost]        public ActionResult MUploadImg(HttpPostedFileBase mfile)        {            return UploadImg(mfile, "Mobile");        }
[HttpPost]        public ActionResult UploadImg(HttpPostedFileBase file, string dir = "UserImg")        {            if (CheckImg(file, imgtypes) != "ok") return Json(new { Success = false, Message = "文件格式不对!" }, JsonRequestBehavior.AllowGet);            if (file != null)            {                var path = "~/Content/UploadFiles/" + dir + "/";                var uploadpath = Server.MapPath(path);                if (!Directory.Exists(uploadpath))                {                    Directory.CreateDirectory(uploadpath);                }                string fileName = Path.GetFileName(file.FileName);// 原始文件名称                string fileExtension = Path.GetExtension(fileName); // 文件扩展名                //string saveName = Guid.NewGuid() + fileExtension; // 保存文件名称 这是个好方法。                string saveName = Encrypt.GenerateOrderNumber() + fileExtension; // 保存文件名称 这是个好方法。                file.SaveAs(uploadpath + saveName);                return Json(new { Success = true, SaveName = path + saveName });            }            return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);        }
View Code

调用:

UploadImg

点击选择文件

扩展到$对象而不扩展到$.fn,是因为zepto中绑定事件的时候后者不方便,传递id或样式名容易绑定。手机端可以自动的调出相机和相册。默认是不预览的图片的,需要制定预览区域,进度条需要自己写样式,只返回了进度值。

同时传2张的效果:

参考了两篇博客:

http://www.cnblogs.com/hutuzhu/p/5254532.html

http://www.lanrenzhijia.com/js/css3/2864.html

你可能感兴趣的文章
陈天奇团队新研究:自动优化深度学习工作负载
查看>>
你的无人机快递来了?小心被查“水表”
查看>>
收录 Uboot 详解
查看>>
MongoDB数据库的索引操作(转)
查看>>
线程的实现
查看>>
重建日志文件
查看>>
鱼鹰软件荣获“北京广告产业发展30周年”杰出贡献单位奖
查看>>
四、oracle基本sql语句和函数详解
查看>>
中合国创杯2017年创客中国互联网+创新创业大赛复赛成功举办 20各项目入围总决赛...
查看>>
UVAoj 11324 - The Largest Clique(tarjan + dp)
查看>>
使用Matplotlib绘制正余弦函数、抛物线
查看>>
四位辉光管时钟-学长毕设
查看>>
大话RAC介质恢复---联机日志损坏
查看>>
oracle 内存分配和调优 总结
查看>>
移植最新版libmemcached到VC++的艰苦历程和经验总结(上)
查看>>
诡异的bug: tcsh陷入死循环
查看>>
java-第一章-上机练习-04
查看>>
Active Directory 基础 (1)
查看>>
xml地图生成网址
查看>>
Python 练习1
查看>>