谈到文件上传,现在一般都用现成的组件可以使用。PC端的可以使用uploadify。针对微网站H5也有uploadifive。但是这组件并不能满足各种场景的需求,例如:预览 切图 放大缩小,取消之类的。

普通上传

HTML:

服务端:

[HttpPost]publicJsonResult Upload()

{if (Request.Files.Count > 0)

{if (Request.Files.Count == 1)

{

HttpPostedFileBase file= Request.Files[0];if (file.ContentLength > 0)

{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 = 0; i < Request.Files.Count; i++)

{

HttpPostedFileBase file=Request.Files[i];if (file.ContentLength > 0)

{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

使用事例

文件多选

有了文件类型限制后 有觉得可以多选是件多么惬意的事情。凭什么桌面应用可以web就不可以。事实证明 当然可以 而且很简单

multiple="multiple"

在input file 标签中加入multiple="multiple"属性 就能愉快的多选文件了

现在最新的HTML代码应该是这个样子了

来看看效果吧

普通上传文件的不足

现在的功能已经可以满足上传基本需求了,但是事情完了吗?远远没有 因为需求就像是程序员的天敌,就是一个字 "改"!这个能做成类似xx界面吗?我觉得界面还可以再改改...

大多时候我们需要上传文件成功后知道文件的地址或者是文件大小等数据,但是现在可能真没办法处理,因为现在上传成功后是这个样子的

尼玛 这是什么鬼。虽然我服务器端上传成功后确实是要返回文件路径和状态,现在也确实返回了 但是咱能不能不要这么赤裸裸的显示在页面上?还有,之前上传的页面去哪了???

jquery ajax上传文件后对返回数据做处理

经过一番改造之后 HTML代码如下

1

2

3

4

5

6

7

8

9

10

11

12 $(document).ready(function () {13 $("#btnImportOK").click(function () {14

15 var formData = new FormData($("#uploadForm")[0]);16 $.ajax({17 type: "POST",18 data: formData,19 url: "/Home/Upload",20 contentType: false,21 processData: false,22 }).success(function (data) {23 if(data.status) {24 console.log(data.url);25 } else{26 console.log(data.msg);27 }28

29 }).error(function (data) {30 alert(data);31 console.log(data);32 });33

34 });35 });36

执行结果

从打印结果可以看到,多文件上传已经成功 并且能够做逻辑控制了

这里有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

图片尺寸限制

啥也不说了 奉上代码

$("#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) {//记录当前时间戳

var start_time = newDate().getTime();//创建对象

var img = newImage();//改变图片的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 > 0 || img.height > 0) {

clearInterval(set);if (img.width > 210 || img.height > 210 || img.width < 190 || img.height < 190) {

alert('建议列表图片尺寸为200*200');return;

}

$("#picshow").attr("src", img.src);

$("#picshow").show();

}

};var set = setInterval(check, 40);

}else{

console.log(data.msg);

}

}).error(function (data) {

alert(data);

console.log(data);

});

});

$("#picshow").hide();

});

总结

这次文件上传就讲到这里吧。没有什么原理性和有深度的东西,就是教程。原谅才疏学浅,后面会越来越好的。

如果我的分享能帮到你,麻烦给点个赞吧!如果发现错误,也请及时拍砖!请关注我的个人主页http://www.cnblogs.com/jingch

jquery 文件上传 触发两次_聊一聊jquery文件上传(支持多文件上传)相关推荐

  1. jquery 文件上传 触发两次_点击三次input按钮,前两次不选择任何文件,第三次选择一个文件,结果上传了3个文件,即发生了三次请求...

    点击三次input按钮,前两次不选择任何文件,第三次选择一个文件,结果页面上出现了3个文件,也就是上传了3个文件 我点击input,不选择任何文件,然后取消文件选择器的窗口,然后第二次次点击input ...

  2. jQuery使用blur()方法触发两次的解决方法

    jQuery使用blur()方法触发两次的解决方法 参考文章: (1)jQuery使用blur()方法触发两次的解决方法 (2)https://www.cnblogs.com/wgl1995/p/92 ...

  3. common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法《很全的监听文件例子》)...

    common-io-2.0的新功能之文件监控FileAlteration(文件监听的两种实现方法<很全的监听文件例子>) 转载于:https://www.cnblogs.com/rocky ...

  4. element文件上传有文件但是后台接收为空_程序员提高篇:大规格文件(G)是如何做分片优化的?...

    作者:凹凸实验室 链接:https://juejin.im/post/5ebb4346e51d451ef53793ad 整体思路 第一步是结合项目背景,调研比较优化的解决方案. 文件上传失败是老生常谈 ...

  5. c语言中的文件类型只有文本文件一种,C语言中的文件类型只有哪两种_后端开发...

    pycharm能干嘛_后端开发 PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Project管理.代码跳转.智能提示 ...

  6. blur失焦方法会触发两次_教程 | ARAMIS光学测量系统散斑制作与光学应变测量方法...

    点击关注↑↑↑更多分享 光学测量系统散斑制作与光学应变测量教程前面我们介绍了光学测量系统的设备标定,本教程主要介绍后续部分即散斑的制作和光学应变测量的方法及具体方案,设备的标定部分可参阅此前文章. 一 ...

  7. blur失焦方法会触发两次_中央空调维修过程中,晶闸管和电容器的检测方法

    晶闸管检测 晶闸管,俗称可控硅整流元件,晶闸管有单向晶闸管和双向晶闸管之分. 单向晶闸管 单向晶闸管有阳极A.阴极K和门级G三个电极,A接高电位,K接低电位.当G悬空或接地时,截止无电流流过,A.K间 ...

  8. transporter上传卡正在交付_【iOS】Xcode11使用Transporter将APP上传到App Store,卡在正在验证APP...

    问题:在使用Transporter时,会卡主,一直显示正在验证APP 在这里插入图片描述 解决方案一:利用V-P-N 在这里插入图片描述 使用安全上网(V-P-N),双击打开iTMSTransport ...

  9. jquery 给类名元素添加行内样式_学Jquery的第一天

    1.创建一个div <body><div id="mydiv"></div> </body> <script src=&quo ...

  10. 以下选项中、不是python对文件的打开模式的是_以下选项中,不是Python对文件的打开模式的是...

    [判断题]不同物质,在产生能级跃迁时,吸收的光的频率是相同的 [单选题]下面代码的输出结果是 x=0b1010 print(x) [判断题]7.公路运输统一单证由交通部统一制定格式,这些单证可以作为物 ...

最新文章

  1. select的value值为对象时,获取label和value
  2. Google将如何改变你观看电视的习惯
  3. Ansible — ansible.cfg 配置文件解析
  4. ubuntu 使用FFTW快速计算离散傅里叶变换
  5. 10月网民上网高峰时段为晚上8点 比例升至6.64%
  6. python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代
  7. 题目:输入某年某月某日,判断这一天是这一年的第几天?
  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_03-freemarker测试环境搭建
  9. 虚拟机访问服务器文件夹,浅析CentOS8虚拟机访问Windows10主机文件夹方法
  10. [转]c# 语音卡控制--语音卡电话呼叫系统
  11. demo解析 小程序node.js_小程序基于疼讯qcloud的nodejs开发服务器部署
  12. 暖暖CEO姚润昊:“公司80%都是女生,大多是踏实的90后”
  13. python 问题Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
  14. 学习linux杂七杂八——关于shell中的变量
  15. 笔记:期权定价-无套利理论
  16. MATLAB工具学习:cftool(曲线拟合工具)
  17. 2d绘制 c# dx_如何在C#中绘制2D等高线图?
  18. 使用OpenCV+ZBar实现多条形码识别
  19. 一例所有文件都打不开故障的数据恢复过程(转)
  20. 读书笔记《学习之道》芭芭拉·奥克利 - 三 最后总结

热门文章

  1. 春节红包战:他们到底在争什么?
  2. oracle 经纬度格式转换,GOOGLE与百度经纬度互转(plsql版)
  3. html页面实现pdf打印预览,利用pdfjs在线预览、打印pdf
  4. Linux之安装显卡驱动
  5. 值得收藏的网站----安全
  6. 实验二-软件项目管理的直观感受
  7. C# 如何提取PDF文本和图片
  8. 关于数据安全中一些概念的学习——容灾备份
  9. 基于mpvue创建微信小程序项目
  10. 【C系列】结构体数组初始化方法