前段时间将flash的上传控件替换成使用纯js实现的,在此记录
1.创建标签
<div class="camera-area" style="display:inline-block;float:left"> <input type="file" id="UploadFile" name="fileToUpload" class="fileToUpload" style="float:left;auto;padding:10px 0" /> <div class="upload-progress"></div> <div class="thumb"> <img id="myPhoto" /> </div> </div>
div内部有3个标签 第一个是上传,第二个是上传进度,第三个为了上传的预览
2.封装上传插件
//拓展 $.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) { var returnModel = JSON.parse(evt.target.responseText); if (returnModel.url) { $("#" + opts.id).val(returnModel.url); } if (!returnModel.success) { alert(returnModel.msg); $(".upload-progress").html("0%"); $(".thumb img").attr("src", ""); $("#" + opts.id).val(""); } } }; doms.fileToUpload.on("change", function () { doms.progress.find("span").width("0"); funs.fileSelected(); }); }); } });
3.调用封装的控件
$(".camera-area").fileUpload({
"url": "/Home/SavePhoto",
"file": "fileName",
"id": "Photo"
});
url:上传的位置
file:后台接收此文件的参数
id:当前是冗余拓展,博主本意是上传到服务器后返回个url,url指向上传文件的服务器路径
4.控制器接收文件并且保存(简单实现)
[HttpPost] /// <summary> /// 上传文件 /// </summary> /// <returns></returns> public ActionResult SavePhoto() { //fileName要和视图的插件参数一致 HttpPostedFileBase file = HttpContext.Request.Files["fileName"]; string savePath = Path.Combine(Server.MapPath("~/Temp/"), DateTime.Now.Year.ToString(), DateTime.Now.Month.ToString()); if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + Path.GetExtension(file.FileName); fileName = Path.Combine(savePath, fileName); file.SaveAs(fileName); return this.Json(new { success = true }); }