AjaxFileUpload.js实现异步上传文件功能


Posted in Javascript onApril 19, 2019

做软工作业时,需要实现无刷新异步上传图片到服务器,于是想利用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"
   });
 }
 })   
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 命名规则 变量命名规则
Feb 25 Javascript
使用Js让Html中特殊字符不被转义
Nov 05 Javascript
javascript函数声明和函数表达式区别分析
Dec 02 Javascript
jQuery插件EasyUI实现Layout框架页面中弹出窗体到最顶层效果(穿越iframe)
Aug 05 Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 Javascript
js获取元素下的第一级子元素的方法(推荐)
Mar 05 Javascript
JS实现加载时锁定HTML页面元素的方法
Jun 24 Javascript
ES6基础之默认参数值
Feb 21 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 Javascript
原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】
Aug 15 Javascript
vue element 生成无线级左侧菜单的实现代码
Aug 21 Javascript
vue3.0 的 Composition API 的使用示例
Oct 26 Javascript
读懂CommonJS的模块加载
Apr 19 #Javascript
js module大战
Apr 19 #Javascript
如何根据业务封装自己的功能组件
Apr 19 #Javascript
vue项目打包上传github并制作预览链接(pages)
Apr 19 #Javascript
vue组件之间的数据传递方法详解
Apr 19 #Javascript
详解keep-alive + vuex 让缓存的页面灵活起来
Apr 19 #Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
Apr 19 #Javascript
You might like
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP Curl出现403错误的解决办法
2014/05/29 PHP
学习php开源项目的源码指南
2014/12/21 PHP
Symfony2学习笔记之模板用法详解
2016/03/17 PHP
PHP线程的内存回收问题
2016/07/08 PHP
express的中间件basicAuth详解
2014/12/04 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
javascript控制台详解
2015/06/25 Javascript
JavaScript基于ajax编辑信息用法实例
2015/07/15 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
vuejs实现本地数据的筛选分页功能思路详解
2017/11/15 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
垃圾回收器的相关知识点总结
2018/05/13 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python使用Berkeley DB数据库实例
2014/09/26 Python
用Python实现一个简单的线程池
2015/04/07 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
python动态进度条的实现代码
2019/07/03 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
html5需遵循的6个设计原则
2016/04/27 HTML / CSS
HR喜欢的自荐信格式
2013/10/08 职场文书
大一自我鉴定范文
2013/12/27 职场文书
物流管理专业职业生涯规划书
2014/01/06 职场文书
班干部演讲稿
2014/04/24 职场文书
投标承诺函范文
2015/01/21 职场文书
小学生交通安全寄语
2015/02/27 职场文书
图书馆义工感想
2015/08/07 职场文书
安全伴我行主题班会
2015/08/13 职场文书