做软工作业时,需要实现无刷新异步上传图片到服务器,于是想利用Ajax:
得到file的val,再post过去…
等真正实现的时候才发现,根本行不通。
于是翻来翻去找到一个封装好的js插件,可以实现异步上传文件。
AjaxFileUpload
这个插件的原理是创建隐藏的表单和iframe,然后用JS去提交,获得返回值。
语法
$.ajaxFileUpload([options])
参数说明
url 上传处理程序地址。
fileElementId 需要上传的文件域的ID,即的ID。
secureuri 是否启用安全提交,默认为false。
dataType 服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
success 提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
error 提交失败自动执行的处理函数。
data 自定义参数。这个东西比较有用,当有数据是与上传的图片相关的时候,这个东西就要用到了。
type 当要提交自定义参数时,这个参数要设置成post
使用方法
引入jQuery与ajaxFileUpload插件(由api中心强力提供)
<script type="text/javascript" src="https://api.mayuko.cn/js/jquery.min.js"></script> <script type="text/javascript" src="https://api.mayuko.cn/js/ajaxfileupload.js"></script>
扩展HTML代码
<td height="52" class="inputContent" ><div align="center">附件1 <input type="file" name="upload_file" id="ss_upload_file1"></td> <td colspan="3"><input type="button" name="Submit3" value="上 传" class="button" id="ss_file_upload"></td>
JS代码
$("#ss_file_upload").click(function(){ $.ajaxFileUpload({ url:'doajaxfileupload.php',//请求地址 secureuri:false,//是否需要安全协议 fileElementId:'ss_upload_file1',//file的ID dataType: 'text',//返回值类型,一般为json success: function(img_data1)//成功后执行 { $(ss_file1_url).attr("value",img_data1); alert("上传成功"); }, error:function(img_data1,status,e){ alert("上传失败"); } }) })
PHP代码
后台就是进行上传操作啦,因为是课程设计所以我将图片上传到了七牛云存储中。
如何上传到七牛中?
<?php //echo var_dump($_FILES); //echo $_FILES['upload_file']['tmp_name']; $file_infor = array("status"=>'',"url"=>''); require_once("qiniu/io.php"); require_once("qiniu/rs.php"); $bucket = "";//你的bucket $key1 = $_FILES["upload_file"]["name"] ; $accessKey = '';//AK $secretKey = '';//SK Qiniu_SetKeys($accessKey, $secretKey); $putPolicy = new Qiniu_RS_PutPolicy($bucket); $upToken = $putPolicy->Token(null); $putExtra = new Qiniu_PutExtra(); $putExtra->Crc32 = 1; list($ret, $err) = Qiniu_PutFile($upToken, $key1,$_FILES["upload_file"]["tmp_name"], $putExtra); $url='bucket域名'.$key1; if ($_FILES["upload_file"]["error"] > 0){ $file_infor["status"] = 'error'; } else{ $file_infor["status"] = 'success'; $file_infor["url"] = $url; } echo $url; ?>
$_FILES是一个数组:
array ( ‘upload_file' => array ( ‘name' => ‘733626970332872971.jpg', ‘type' => ‘image/jpeg', ‘tmp_name' => ‘C:\\Windows\\Temp\\phpF203.tmp', ‘error' => 0, ‘size' => 210744, ), )
这样前台就可以接收到上传图片之后的url值并进行显示操作了。
一般来说,AjaxFileUpload的返回类型是json格式,可是在测试的时候前台一直无法解析json数据,所以无解之后就换成text数据了。
错误提示
1.Uncaught TypeError: Object function (a,b){return new e.fn.init(a,b,h)} has no method ‘handleError'
这是因为高版本的jQuery中取消了handleError方法,在ajaxfileupload.js中加入该方法就可以啦。 ;)
handleError: function( s, xhr, status, e ) { // If a local callback was specified, fire it if ( s.error ) { s.error.call( s.context || s, xhr, status, e ); } // Fire the global callback if ( s.global ) { (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); } }
2.success: function(data)中data为空值
应该是json数据的问题,我的解决方法是设置返回数据的类型是 text,用alert(data +”:” + data.length); 观察返回的数据是否有效。
3.一直跳转到error方法中
当执行if(type==”json”) eval(“data = “+data);会抛出异常,导致在处理异常的时候将status = “error” 因此一直执行error方法。
将ajaxfileupload.js中uploadHttpData: function( r, type ) 方法的 eval(“data = “+data+” “)改为 eval(“data = \” “+data+” \” “);
4.SyntaxError: syntax error错误
检查处理提交操作的服务器后台处理程序是否存在语法错误。
5.change第二次失效
绑定change事件,实现选择图片后自动上传,但是触发一次change事件后,下次就不会再触发change事件。
原因:由于ajaxFileUpload把原来的file元素替换成新的file元素,所以之前绑定的change事件就失效了。
解决方法:在 $.ajaxFileUpload({option})中的回调函数里 重新绑定change事件。
$("#upload_file").change(function(){ UploadImg(); }); UploadImg = function() { $(window).bind('beforeunload',function(){return '正在上传,确定离开此页面吗?';}); $('#loading').attr('style','display:block;') $.ajaxFileUpload({ url:'upload_ajax.php', secureuri:false, fileElementId:'upload_file', dataType: 'text', success: function(data) { $('#loading').attr('style','display:none;'); if(data == 0){ $("body").overhang({ type: "error", message: "上传失败,CODE:00020" }); } else if(data == 1){ $("body").overhang({ type: "success", message: "上传成功!" }); setTimeout(function(){ window.location.reload(); },1000); } else{ $("body").overhang({ type: "error", message: "格式错误,仅支持jpg,png,gif" }); } $(window).unbind('beforeunload'); $("#upload_file").change(function () { UploadImg(); }); }, error:function(data,status,e){ $("body").overhang({ type: "error", message: "上传失败,CODE:00031" }); } }) }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍ajaxfileupload.js实现上传文件功能,包括了ajaxfileupload.js实现上传文件功能的使用技巧和注意事项,需要的朋友参考一下 使用ajaxfileupload.js实现上传文件功能 一、ajaxFileUpload是一个异步上传文件的jQuery插语法:$.ajaxFileUpload([options]) options参数说明: 1、url
本文向大家介绍使用AjaxFileUpload.js实现异步文件上传示例,包括了使用AjaxFileUpload.js实现异步文件上传示例的使用技巧和注意事项,需要的朋友参考一下 ajax是无法提交文件的,所以在上传图片并预览的时候,我们经常使用Ifame的方法实现看似异步的效果。但是这样总不是很方便的,AjaxFilleUpload.js对上面的方法进行了一个包装,使得我们不用去管理Iframe
本文向大家介绍ajax实现异步文件或图片上传功能,包括了ajax实现异步文件或图片上传功能的使用技巧和注意事项,需要的朋友参考一下 大家好,这篇文章我要给大家分享一个网页文件上传功能的代码,希望大家可以有所参考,或者给我提些建议。 众所周知现在的各大网站基本都设有文件上传功能,用户可以把自己喜欢的图片或其他文件放在网上存起来,以便以后用的时候方便去找,可是一个网页的文件上传功能究竟该怎么去设置呢?
本文向大家介绍php+ajax实现异步上传文件或图片功能,包括了php+ajax实现异步上传文件或图片功能的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了ajax异步上传文件或图片功能的具体代码,供大家参考,具体内容如下 php: 点击上传图片并发送后, 可以看到页面上显示出图片, 查看本地文件夹可以看到文件也已储存到服务器. 在客户端实现异步上传的关键在于FormData,关于这部分这
本文向大家介绍使用ajaxfileupload.js实现ajax上传文件php版,包括了使用ajaxfileupload.js实现ajax上传文件php版的使用技巧和注意事项,需要的朋友参考一下 无论是PHP,还是其他的服务端脚本都提供了文件上传功能,实现起来也比较简单。而利用JavaScript来配合,即可实现Ajax方式的文件上传。虽然jQuery本身没有提供这样的简化函数,但有不少插件可以
本文向大家介绍基于Jquery插件实现跨域异步上传文件功能,包括了基于Jquery插件实现跨域异步上传文件功能的使用技巧和注意事项,需要的朋友参考一下 先说明白 这个跨域异步上传功能我们借助了Jquery.form插件,它在异步表单方面很有成效,而跨域我们会在HTTP响应头上添加access-control-allow-method,当然这个头标记只有IE10,火狐和谷歌上支持,对于IE10以下的