上周说到做excel的导入时,用到了jquery的一个上传控件ajaxFileUpload,但今天测试的时候,却出现了问题:
我们不妨先来查看一下ajaxFileUpload的基本语法:
$.ajaxFileUpload ({ url:xxx, secureuri:false, //上传处理地址 fileElementId:'fileToUpload', //上传文件的id dataType: 'json', //传输的数据类型,默认为text //成功响应后回调的函数 data为后台返回的数据 status为成功或失败状态 success: function (data, status) { //some code }, //响应失败后回调的函数 e为错误信息 error: function (data, status, e) { //some code } } )
结果我发现,是无论后台响应是否成功,它都是进入回调函数error:
而我本地写的上传的js如下:
$.ajaxFileUpload({ url : "demo/import.json", //dataType : 'json', secureuri : false, fileElementId : 'file', success : function(res, status) { //some code }, error : function(data, status, e) { //some code } } );
后来发现,我竟然把dataType注掉了。。,并且无论后台是否响应成功,都进的是error回调……因此我把dataType指定为json,
而检查我的后台,发现
我用的google浏览器,debug才发现demo/import.json所对应的后台代码:
@RequestMapping("/demo/import.json") @ResponseBody public String import(@RequestParam(value = "excelFile") MultipartFile excelFile, HttpServletRequest request) { String fileName = excelFile.getOriginalFilename(); String result = ""; try{ //some code result = "success"; } catch(Exception e) { e.printStackTrace(); result = "fail"; } return result; }
返回的是String,该String并不是json格式的。改之:
@RequestMapping("/demo/import.json") @ResponseBody public String import(@RequestParam(value = "excelFile") MultipartFile excelFile, HttpServletRequest request) { String fileName = excelFile.getOriginalFilename(); String result = ""; Map map = new HashMap(); String jsonStr = null; try{ //some code result = "success"; } catch(Exception e) { e.printStackTrace(); result = "fail"; } map.put("data", result); jsonStr = String.valueOf(JSONObject.fromObject(map)); return jsonStr; }
而之前前台没指定dataType,因为传输的数据类型对应不上,所以无论成功与否都会进入error。
同样模拟测试后台响应成功和响应失败,问题依然出现。。
看到网上说的,可能是ajaxfileupload.js版本的问题,即里面判断返回数据类型的js函数:
uploadHttpData: function( r, type ) { var data = !type; data = type == "xml" || data ? r.responseXML : r.responseText; // If the type is "script", eval it in global context if ( type == "script" ) jQuery.globalEval( data ); // Get the JavaScript object, if JSON is used. if ( type == "json" ) eval("data = "+data); // evaluate scripts within html if ( type == "html" ) jQuery("<div>").html(data).evalScripts(); //alert($('param', data).each(function(){alert($(this).attr('value'));})); return data; }
这个js函数表明,当type为json时,直接把回调函数参数里的data指定为后台给你返回的data,但通过google浏览器debug这个方法才发现即使后台返回值类型改成json格式的String,并指定前台dataType属性为json时,获取到的data为<pre style="word-wrap: break-word; white-space: pre-wrap;">{"data":"success"}</pre>他并不是从后台获取到纯json格式的字符串,改正:
if ( type == "json" ) eval("data = "+$(data).html());
清除浏览器缓存,重测,即可得到中间的json 串{"data":"success"}。
这样,无论后台响应成功与否,它不会只进入error了。
但现在问题又来了,虽然不会只进入error但是问题又来了。。无论是否响应成功,它又只进入success回调了,感觉很无语。
同样,通过debug,发现前台回调时,即使后台响应失败,也会给前台返回一个json {”data:“ "fail"},只要有json,他就会进入success。虽说我可以通过在success里取data对应的值,根据data对应的值是success还是fail判断到底是成功响应还是失败响应,但终归不太合理。仔细检查后台代码后,改之:
@RequestMapping("/demo/import.json") @ResponseBody public String import(@RequestParam(value = "excelFile") MultipartFile excelFile, HttpServletRequest request) { Map map = new HashMap(); String jsonStr = null; try{ //some code result = "success"; map.put("data", result); jsonStr = String.valueOf(JSONObject.fromObject(map)); //只有响应成功才会得到json格式的字符串——前台进入success回调 } catch(Exception e) { e.printStackTrace(); result = "fail"; //map.put("data", result); //如果响应失败,则不会生成json格式的字符串,返回的就只是一个空的String而已——前台进入error回调 } return jsonStr; }
再次模拟成功和失败响应之后,终于”各找各妈“了——成功响应的进入success回调,响应失败的进入error回调。。
小结:如果是传输类型是json格式,如果后台返回的不是json格式的字符串,则前台只会进error回调;如果后台返回的是json格式的字符串,但如果响应失败也给他返回一个json字符串时,前台也会进入success回调。
推荐一个相对稳定的ajaxFileUpload.js版本下载(见附件):
相关推荐
本篇将深入探讨如何利用jQuery和`ajaxfileupload.js`实现一个自动上传控件。 首先,jQuery是一个广泛使用的JavaScript库,它提供了一系列简便的API来操作DOM、处理事件、执行异步请求等。在文件上传场景中,jQuery...
在`success`回调函数中,我们接收到服务器返回的XML数据,然后调用`parseXml`函数进行解析。解析XML有多种方法,这里使用JavaScript内置的`DOMParser`对象: ```javascript function parseXml(xmlData) { var ...
3. **配置AjaxFileUpload**:使用jQuery选择器获取文件输入元素,并调用AjaxFileUpload方法进行配置,包括设置上传URL、成功回调、错误回调等。 4. **触发上传**:绑定一个点击事件到上传按钮,当点击时触发文件上传...
包括请求类型(post或get)、上传服务器端请求地址(url)、是否启用安全提交(secureuri)、文件上传控件的id(fileElementId)、返回值类型(dataType)、用于post请求提交的自定义参数(data)以及成功和失败的...
error回调函数则用于处理上传失败的情况,它会提供关于上传失败的状态信息。data参数可以用来传递一些与上传文件相关的自定义数据。如果需要提交自定义数据,通常需要将type参数设置为post。 通过上述方法,可以为...
本文详细介绍了在使用EasyUI框架中的`filebox`控件进行文件上传时遇到的一些常见问题及其解决办法。特别是针对如何实现文件的异步上传、处理上传文件的逻辑以及如何在保存记录时清除未使用的文件等方面进行了深入的...
成功上传后,服务器返回的JSON数据可以通过success回调函数处理,例如将返回的URL赋值给img标签的src属性来显示图片。 五、注意事项 在实际开发中,可能需要针对不同的浏览器和设备(比如手机和平板电脑)进行适配...
- error回调函数用于处理上传过程中遇到的错误,如网络异常或表单数据错误等。同样可以使用$.messager.alert来弹出错误信息,给用户提供反馈。 - 在回调函数中,data参数包含了错误信息,可以将这些信息展示给用户...
- `success`和`error`回调函数:分别用于处理文件上传成功和失败后的逻辑。 6. 后台代码说明: - C#后台代码主要处理请求、接收文件、保存文件,并返回保存路径给前端。 - 首先通过`HttpContext`对象获取请求...
设置回调函数处理上传过程中的进度更新和完成后的响应。 ```javascript $(document).ready(function () { $("#uploadButton").click(function () { $("#fileUpload").ajaxFileUpload({ url: "UploadFile.aspx", ...
在构建Web应用时,文件上传是一项常见的功能,尤其是在使用SpringMVC作为后端框架和EasyUI作为前端组件库的情况下。本篇文章将详细讲解如何利用EasyUI的`$.ajaxFileUpload`插件与SpringMVC结合,实现无刷新的文件...
在上传成功后,插件的`success`事件回调函数会被触发。在此函数中,根据服务器返回的数据,可以判断上传是否完全符合要求,如果不符合,也可以给出具体的错误提示。上传成功后,页面上相应的元素(例如头像预览图片...
在.NET框架中,ASP.NET提供了一种强大的方法来处理用户上传的文件,特别是"无刷新上传文件"技术,它极大地提升了用户体验。无刷新文件上传,也称为Ajax(异步JavaScript和XML)上传,允许用户在不重新加载整个网页的...
4. **响应处理**:在`success`回调函数中,你可以解析服务器返回的数据(通常是JSON格式),并更新页面内容,显示上传结果。 综上所述,`jsp ajax fileupload`的实现涉及前后端的协同工作。前端通过Ajax发送文件,...
在现代Web开发中,jQuery库提供了许多方便的功能,其中之一就是使用Ajax进行文件上传。这种方式允许用户在不刷新整个页面的情况下提交文件,提升了用户体验。本文将详细介绍如何利用jQuery和Ajax实现文件上传。 ...
本篇文章将深入探讨如何使用SpringMVC框架与ajaxfileupload.js库来实现这一功能,让文件上传过程在不刷新整个页面的情况下完成,提供更流畅的用户体验。 首先,我们需要在`web.xml`中配置SpringMVC的前端控制器。`...
在ASP.NET MVC框架中,开发人员经常需要处理文件上传功能,但传统的文件上传方式会导致整个页面刷新,用户体验不佳。为了实现异步文件上传,避免页面重载,我们可以借助JavaScript库,如jQuery,以及一些插件,如...
在本文中,我们将深入探讨如何使用jQuery AJAX实现上传附件的功能,这是HTML5中的一项重要进步。在HTML4时代,由于缺乏FileReader接口,...这种方法避免了使用专门的文件上传插件,如AjaxFileUpload,简化了开发流程。