我正在尝试使用$ .ajaxFileUpload上传文件。我的服务器脚本返回一个json对象,例如。
{“imgName”:“test.jpg”,“imgUrl”:“/ uploadl / images / profile / sam.jpg”}
当我在firefox中检查时,它会显示正确的响应。 Json也被收到了。但我仍然收到警告错误:
SyntaxError: missing } in XML expression
我无法理解为什么会出现此错误。 同样在firebug中Json对象也能正确显示。
<script type='text/javascript' src='/js/ajaxfileupload.js'></script>
<script type='text/javascript'>
function doFileUpload(){
$("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});
$.ajaxFileUpload(
{
url:'/json/image/upload.html?action=saveImage&nameSpace=tot',
secureuri:false,
fileElementId:'imgFile',
dataType: 'json',
success: function (data, status){
alert("Success: "+data.imgUrl);
},
error: function (data, status, e){
alert("Error: "+e+"---URL: "+data.imgUrl);
}
}
)
}
</script>
.... ....
<div>
<strong>Upload Images:</strong><br>
<input type='file' name='imgFile' id='imgFile'>
<img src='/images/loading.gif' id='loading' height='60px' width='60px' style='display:none'>
<br><button name='upload' id='upload' onclick='return doFileUpload();'>Upload</button>
</div>
任何人都可以告诉我错误的原因是什么?
答案 0 :(得分:7)
我终于找到了问题。问题在于我正在使用的Jquery的AjaxFileUpload插件。而不是dataType中的'json',它需要大写。 dataType:'JSON'。在固定之后,它自动添加&lt; pre&gt;和&lt; / pre&gt;到收到的json数据的开头和结尾。所以它不是解释ad json。
我收到的实际数据是
<pre>{"imgName": "test.jpg", "imgUrl": "/uploadtest/images/profile/sam.jpg"}</pre>
现在我必须删除那里的标签然后用$ .parseJson()解析它。 如果有人有相同的错误,请检查这些问题。 我希望很快就能修复ajaxFileUpload插件。
答案 1 :(得分:3)
我发现随着Mozila的返回数据,我遇到了这个问题。实际上该消息是与<p>message</p>
一起返回的,这是一个错误。
我应用的修复是删除返回消息中不需要的任何内容,它正在运行。但我不确定它是否是永久性修复。在ajaxfileupload.js脚本文件的末尾,我修改了uploadHttData
函数
uploadHttpData: function( r, type ) {
var data = !type;
var dataparsed = r.responseText.split("{"); //added by Jude
dataparsed = dataparsed[1].split("}"); //added by Jude
///Commented By Jude
///data = type == "xml" || data ? r.responseXML : r.responseText;
// If the type is "script", eval it in global context
data = type == "xml" || "{ " + dataparsed[0] + " }"; //added by Jude
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;
}
答案 2 :(得分:2)
我已经解决了这个问题,
只需更新代码行:
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
有了这个:
xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.textContent:null;
innerHTML导致问题。
答案 3 :(得分:2)
从您可以使用正则表达式的响应重新格式化pre(信用:https://github.com/carlcarl/AjaxFileUpload)
if ( type == "json" )
{
// If you add mimetype in your response,
// you have to delete the '<pre></pre>' tag.
// The pre tag in Chrome has attribute, so have to use regex to remove
var data = r.responseText;
var rx = new RegExp("<pre.*?>(.*?)</pre>","i");
var am = rx.exec(data);
//this is the desired data extracted
var data = (am) ? am[1] : ""; //the only submatch or empty
eval( "data = " + data );
}
我通过在github上搜索ajaxfileupload找到了json问题的解决方案,并且发现这个版本在我大写JSON后正常工作
答案 4 :(得分:1)
如果您想要返回单维json响应,Jude Adeline的回答是正确的。如果您想从PHP返回多维数组,请将代码修改为以下内容。
uploadHttpData: function( r, type ) {
var data = !type;
var dataparsed = r.responseText.substr(1); //changed-added
dataparsedLength = dataparsed.length; //changed-added
dataparsed = dataparsed.substr(0, dataparsedLength-1); //changed-added
data = type == "xml" || "{ " + dataparsed + " }"; //changed-added
// 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();
return data;
}
答案 5 :(得分:1)
我遇到过这个问题 - 你只需改变一行 if((type ==“json”)||(type ==“JSON”))然后在FireFox和IE中工作正常
答案 6 :(得分:1)
我有这样的错误
我用过:
$Ex=end(explot('.', image));
在doajaxfileupload.php中,它给出了错误:
XML表达式“中的”AjaxFileUpload SyntaxError:missing}
我把它改为:
$tmp=explot('.', image);
$Ex=end($tmp);
这对我有用
PHP documentation给出了这个例子:
mixed end ( array &$array ); $fruits = array('apple', 'banana', 'cranberry'); echo end($fruits); // cranberry
答案 7 :(得分:0)
要解决此问题,请确保将“内容类型”设置为“text / html”。
确实看起来很奇怪: - )
原因是Firefox处理答案以构建文档。 当答案的内容类型为“text / plain”Firefox时,只显示html,通过添加标签将答案转换为html。