聊一聊jquery文件上传(支持多文件上传)
谈到文件上传,现在一般都用现成的组件可以使用。PC端的可以使用uploadify。针对微网站H5也有uploadifive。但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的。
普通上传
HTML:
<form action="Upload" method="post" enctype="multipart/form-data">
<input id="File1" name="fileupload" type="file" value="" /><input id="" type="submit" value="上传" />
</form>
服务端:
[HttpPost]
public JsonResult Upload()
{
if (Request.Files.Count > )
{
if (Request.Files.Count == )
{
HttpPostedFileBase file = Request.Files[];
if (file.ContentLength > )
{
string title = string.Empty;
title = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + Path.GetFileName(file.FileName);
string path = "../UploadFile/" + title;
path = System.Web.HttpContext.Current.Server.MapPath(path);
file.SaveAs(path);
return Json(new { status = true, url = path });
}
}
else
{
string[] urllist = new string[Request.Files.Count];
for (int i = ; i < Request.Files.Count; i++)
{
HttpPostedFileBase file = Request.Files[i];
if (file.ContentLength > )
{
string title = string.Empty;
title = DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + Path.GetFileName(file.FileName);
string path = "../UploadFile/" + title;
path = System.Web.HttpContext.Current.Server.MapPath(path);
file.SaveAs(path);
urllist[i] = path;
}
}
return Json(new { status = true, url = urllist });
} }
else
{
return Json(new { status = false, url = "",msg="没有文件" });
} return Json(new { status = false, url = "",msg=""});
}
后端代码没什么不同的,一直就是如此
主要是前端html,我标记为红色字体的属性一个都不能少,少一个都不可能完成上传
action
作用:该属性的值指向要提交到某一个页面,缺少它会不知道提交给谁
可以提交的页面:abc.aspx abc.ashx mvc的控制器方法 webapi接口 以及其他后端处理程序
method
作用:该属性的值决定以何种方式提交,缺少它会报404
可以取的值:post get put delete enctype
作用:指定类型 缺少它在后台接收时文件并不会包含进去
可以取的值:multipart/form-data application/x-www-form-urlencoded text/plain 此处必须使用 multipart/form-data才能将文件传到服务端
name
input file 里面必须包含name属性才能够将文件传递到服务器,具体原因不知道,有兴趣的可以尝试下 如果有知道的麻烦解惑 相信到了这里你一定可以完成上传文件操作了!
文件类型筛选
能完成基本的文件上传操作之后,我们会对它有更多的要求,比如:文件筛选
相信大家都不愿意让人什么类型的文件都往服务器上传,万一是病毒或者脚本之类的就麻烦大了。于是就开始了对文件的类型限制
accept
作用:就是用来做条件筛选的
取值范围:
图片类 image/gif image/jpeg image/png .. 多个类型之间用,隔开 如accept="image/gif, image/jpeg"
文档类
doc application/msword
css text/css
excel application/vnd.ms-excel
ppt application/vnd.ms-powerpoint
多媒体类
mp3 audio/mpeg
mp4 audio/mp4 video/mp4
使用事例
<input id="File1" name="fileupload" accept="image/gif, image/jpeg" type="file" value="" />
更多类型详情请参考http://blog.sina.com.cn/s/blog_6c9d65a10101a8yh.html
文件多选
有了文件类型限制后 有觉得可以多选是件多么惬意的事情。凭什么桌面应用可以web就不可以。事实证明 当然可以 而且很简单
multiple="multiple"
在input file 标签中加入multiple="multiple"属性 就能愉快的多选文件了
现在最新的HTML代码应该是这个样子了
<form action="Upload" method="post" enctype="application/x-www-form-urlencoded" >
<input id="File1" name="fileupload" accept="image/gif, image/jpeg" multiple="multiple" type="file" value="" />
<input id="" type="submit" value="上传" />
</form>
来看看效果吧

普通上传文件的不足
现在的功能已经可以满足上传基本需求了,但是事情完了吗?远远没有 因为需求就像是程序员的天敌,就是一个字 "改"!这个能做成类似xx界面吗?我觉得界面还可以再改改...
大多时候我们需要上传文件成功后知道文件的地址或者是文件大小等数据,但是现在可能真没办法处理,因为现在上传成功后是这个样子的

尼玛 这是什么鬼。虽然我服务器端上传成功后确实是要返回文件路径和状态,现在也确实返回了 但是咱能不能不要这么赤裸裸的显示在页面上?还有,之前上传的页面去哪了???
jquery ajax上传文件后对返回数据做处理
经过一番改造之后 HTML代码如下
<form id="uploadForm" action="Upload" method="post" enctype="multipart/form-data">
<input id="File1" name="fileupload" accept="image/gif, image/jpeg" multiple="multiple" type="file" value="" />
<input id="btnImportOK" type="button" value="上传" />
</form>
<script src="~/Scripts/jquery-1.8.3.min.js"></script>
<script type="text/javascript"> $(document).ready(function () {
$("#btnImportOK").click(function () { var formData = new FormData($("#uploadForm")[0]);
$.ajax({
type: "POST",
data: formData,
url: "/Home/Upload",
contentType: false,
processData: false,
}).success(function (data) {
if (data.status) {
console.log(data.url);
} else {
console.log(data.msg);
} }).error(function (data) {
alert(data);
console.log(data);
}); });
});
</script>
执行结果

从打印结果可以看到,多文件上传已经成功 并且能够做逻辑控制了
这里有2点必须特别说明
1.Jquery版本
从第15行html代码可以看到
var formData = new FormData($("#uploadForm")[0]);
data传递过去的参数是formData 但是FormData这个类是jquery版本比较高的文件中才会有 所以我这里引用的是jquery1.83 之前asp.net mvc模板默认给我安装的是jquery1.10.2的版本,是不支持的
2.$("form").serialize()
之前也查看网上资料 都推荐用它来上传文件,于是就写成了这样
$.ajax({
type: "POST",
data: $("#uploadForm").serialize(),
url: "/Home/Upload",
contentType: false,
processData: false,
}).success(function (data) {
if (data.status) {
console.log(data.url);
} else {
console.log(data.msg);
}
}).error(function (data) {
alert(data);
console.log(data);
});
});
但是后台一直没有接收到文件,然后经过一番努力搜索资料翻答案,原来文件无法被serialize()序列化,最后推荐用FormData
图片尺寸限制
啥也不说了 奉上代码
<img id="picshow" width="" height="" src="" />
<form id="uploadForm" action="Upload" method="post" enctype="multipart/form-data">
<input id="File1" name="fileupload" accept="image/gif, image/jpeg" multiple="multiple" type="file" value="" />
<input id="btnImportOK" type="button" value="上传" />
</form>
<script src="~/Scripts/jquery-1.8.3.min.js"></script>
<script type="text/javascript"> $(document).ready(function () {
$("#btnImportOK").click(function () { var formData = new FormData($("#uploadForm")[]);
$.ajax({
type: "POST",
data: formData,
url: "/Home/Upload",
contentType: false,
processData: false,
}).success(function (data) {
if (data.status) {
// 记录当前时间戳
var start_time = new Date().getTime(); // 创建对象
var img = new Image(); // 改变图片的src
// img.src = data.url; 此处注释是因为上传保存是路径是本地磁盘 浏览器被阻止访问 所以用了一个远程图片
img.src = "http://a0.att.hudong.com/05/23/01300000727181126443238971302.jpg";
// 定时执行获取宽高
var check = function () {
console.log(img.width);
// 只要任何一方大于0
// 表示已经服务器已经返回宽高
if (img.width > || img.height > ) { clearInterval(set); if (img.width > || img.height > || img.width < || img.height < ) {
alert('建议列表图片尺寸为200*200');
return;
}
$("#picshow").attr("src", img.src);
$("#picshow").show();
}
}; var set = setInterval(check, );
} else {
console.log(data.msg);
} }).error(function (data) {
alert(data);
console.log(data);
}); });
$("#picshow").hide();
});
</script>
总结
这次文件上传就讲到这里吧。没有什么原理性和有深度的东西,就是教程。原谅才疏学浅,后面会越来越好的。
如果我的分享能帮到你,麻烦给点个赞吧!如果发现错误,也请及时拍砖!请关注我的个人主页http://www.cnblogs.com/jingch
聊一聊jquery文件上传(支持多文件上传)的更多相关文章
- skymvc文件上传支持多文件上传
skymvc文件上传支持多文件上传 支持单文件.多文件上传 可以设定 文件大小.存储目录.文件类型 //上传的文件目录 $this->upload->uploaddir="att ...
- Webuploader 简单图片上传 支持多图上传
简介: 通过webuploader 实现简单的图片上传功能,支持多张图上传 官方文档传送门:http://fex.baidu.com/webuploader/getting-started.html# ...
- 让你的Photoshop编辑制作ICO格式图标文件(ICOFormat支持图标文件插件)
相信非常多制图的朋友都喜欢用PS,可是你能用Photoshop保存为ICO格式图标文件吗?默认肯定不行.不知道是什么原因,大名鼎鼎的图像编辑软件Adobe Photoshop一直不支持导入导出ico格 ...
- ELF文件解析器支持x86x64ELF文件
此文为静态分析ELF文件结构,遍历其中Elf_Ehdr文件头信息,遍历Elf_Shdr节表头信息,并将所有节放置在左侧树控件上,遍历Elf_Phdr程序头也放置在左侧树控件上,并着重分析字符串表,重定 ...
- Java计算文件MD5值(支持大文件)
import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.securit ...
- 30分钟玩转Net MVC 基于WebUploader的大文件分片上传、断网续传、秒传(文末附带demo下载)
现在的项目开发基本上都用到了上传文件功能,或图片,或文档,或视频.我们常用的常规上传已经能够满足当前要求了, 然而有时会出现如下问题: 文件过大(比如1G以上),超出服务端的请求大小限制: 请求时间过 ...
- HTML5文件上传器,纯脚本无插件的客户端文件上传器---Uploader 文件上传器类
概述 客户端完全基于JavaScript的 浏览器文件上传器,不需要任何浏览器插件,但需要和jQuery框架协同工作,支持超大文件上传,其算法是将一个超大文件切片成N个数据块依次提交给服务 端处理,由 ...
- 框架基础:ajax设计方案(三)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...
- 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...
- java+上传后的文件展示
文件夹结构支持 大文件上传控件6支持向服务器上传整个文件夹,并且在服务端保存时与本地目录结构完全保持一致,同时在数据库中也保留文件夹的层级结构.开发人员可以借助于数据库中的层级信息方便的管理文件,管理 ...
随机推荐
- Bootstrap学习之起步
安装Bootstrap环境 从 http://getbootstrap.com/ 上下载 Bootstrap 的最新版本.我下载的是预编译版,即下图中的第一个. 将其解压缩到任意目录即可看到以下(压缩 ...
- markdown语法书
因为初用markdown,所以对它的语法还不是很熟悉.喜欢简书的风格,特地拷贝了一份markdown语法手册,可以实现效果立显. http://www.jianshu.com/writer#/note ...
- Vue2.X的路由管理记录之 钩子函数(切割流水线)
$route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,里面的属性是 immutable(不可变) 的,不过你可以 watch(监测变化) 它. 导航和钩子函数: 导航:路由正在发生 ...
- 16061701(地图灯光编译Beast报错)
[目标] 地图灯光编译报错 [思路] 1 我自己测c2_cwd_rt 附件为当时log 2 ExampleGame\BeastCache\PersistentCache 3 重新删除掉BeastCac ...
- Linq to xml 小例
static void Main(string[] args) { string strXml = @"<?xml version='1.0' en ...
- Avast!:小型网站最易遭受的3种黑客攻击
avast是捷克研发的杀毒软件,从网站上找到一篇avast关于网站安全的文章,觉得颇有意思,因此想到翻译过来与大家共享.有不对之处还望大家批评指正. 一个拥有上万访问者的小型网站管理员发来一份信,向我 ...
- [转]CSS3 Media Query实现响应布局
讲到响应式布局, 相信大家都有一定的了解,响应式布局是今年很流行的一个设计理念,随着移动互联网的盛行,为解决如今各式各样的浏览器分辨率以及不同移动设备的显示效果, 设计师提出了响应式布局的设计方案.今 ...
- Spark-1.5.1 on CDH-5.4.7
1.修改拷贝/root/spark-1.5.1-bin-hadoop2.6/conf下面spark-env.sh.template到spark-env.sh,并添加设置HADOOP_CONF_DIR: ...
- Console命令详解,让调试js代码变得更简单
Firebug是网页开发的利器,能够极大地提升工作效率. 但是,它不太容易上手.我曾经翻译过一篇<Firebug入门指南>,介绍了一些基本用法.今天,继续介绍它的高级用法. ======= ...
- android 加载中、无网络、无数据、出错 四种状态的代码封装
package com.weavey.loading.lib;import android.content.Context;import android.content.res.TypedArray; ...