我想通过jQuery异步上传文件,这是我的HTML:
1 2 3 | <span>File</span><input type="file" id="file" name="file" size="10"/><input id="uploadbutton" type="button" value="Upload"/> |
这是我的javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $(document).ready(function () { $("#uploadbutton").click(function () { var filename = $("#file").val(); $.ajax({ type: "POST", url: "addFile.do", enctype: 'multipart/form-data', data: { file: filename }, success: function () { alert("Data Uploaded: "); } }); });}); |
我只得到上传的文件名,咋办?
我现在用了 jQuery Form插件来解决这个问题:http://malsup.com/jquery/form/#code-samples
有没有不用该插件来实现呢?
解决方法:
可以采用HTML5,用jQuery,Ajax实现文件上传,不仅如此,你可以做文件验证(名称,大小,MIME类型)或利用HTML5的进度标签(或者div)处理进度事件。
最近我也在做文件上传,我不想用flash、iframe或其它插件,经过一番研究,我想出了解决方案。
HTML:
1 2 3 4 5 | <form enctype="multipart/form-data"><input name="file" type="file" /><input type="button" value="Upload" /></form><progress></progress> |
首先,你可以做一些验证,例如文件的onChange事件:
1 2 3 4 5 6 7 | $(':file').change(function(){ var file = this.files[0]; name = file.name; size = file.size; type = file.type; //your validation}); |
按钮点击触发Ajax:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | $(':button').click(function(){ var formData = new FormData($('form')[0]); $.ajax({ url: 'upload.php', //server script to process data type: 'POST', xhr: function() { // custom xhr myXhr = $.ajaxSettings.xhr(); if(myXhr.upload){ // check if upload property exists myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload } return myXhr; }, //Ajax事件 beforeSend: beforeSendHandler, success: completeHandler, error: errorHandler, // Form数据 data: formData, //Options to tell JQuery not to process data or worry about content-type cache: false, contentType: false, processData: false });}); |
处理进度:
1 2 3 4 5 | function progressHandlingFunction(e){ if(e.lengthComputable){ $('progress').attr({value:e.loaded,max:e.total}); }} |
HTML5的文件上传非常简单,但必须在支持HTML5的浏览器中运行。
评论列表
wuchangliang2013/11/8 18:11:53
var formData = new FormData($('form')[0]);
请问,在ie上有没有好的方法代替呢?
请问,在ie上有没有好的方法代替呢?
s2015/4/30 16:38:36
ewe
3268013878@qq.co2015/8/28 9:12:00
请问为什么我进入了error区间,输出TypeError:Cannot read property 'open' of underfined
3268013878@qq.co2015/8/28 9:12:22
请问为什么我进入了error区间,输出TypeError:Cannot read property 'open' of underfined
122015/9/29 11:10:57
fgsdf
大向2015/12/17 19:33:53
我想用异步请求实现与数据库的交换,但是用不好,每次都是死循环。请高人指点!
大向2015/12/17 19:36:16
我有个建议,不知道好不好。左边的文字颜色容易使人看不太清楚,易花眼。建议换成深颜色的。
momo2016/4/15 17:35:54
The current request is not a multipart request 为什么报这个错呢
仍然有2016/7/1 14:44:33
热有人要
你好2016/7/20 14:38:24
可以上传视频和png格式的图片吗
你好2016/7/20 14:38:46
可以上传视频和png格式的图片吗,急等着用。谢谢!
只能帮到你这里了2016/10/18 14:30:24
var filename = $("#file").val(); 这个写法本来就得不到文件吧
文件是$("#file").prop("files")[0]
文件是$("#file").prop("files")[0]
aa2016/11/24 10:47:55
beforeSend: beforeSendHandler,
success: completeHandler,
error: errorHandler,
未定义。怎么改呢
success: completeHandler,
error: errorHandler,
未定义。怎么改呢
bjiang2017/11/8 18:08:27
我最常用的方法是,让form submit到页面中的一个隐藏的iframe中,然后通过页面间通讯的方式来告知原来的主页面已经上传完成.但这个解决不了进度条的问题.
</div>
发表评论
</div>
基于Twemproxy的Redis集群方案(转载)
Mongodb数据模型
关于LRU算法(转载)
基于Redis实现分布式锁(转载)
Redis持久化(转载)
redis 内存管理与数据淘汰机制(转载)
redis事务(转载)
redis发布与订阅
redis的数据类型和基本操作