XML表达式中的AjaxFileUpload SyntaxError:missing}

时间:2010-10-15 05:37:17

标签: javascript ajax

我正在尝试使用$ .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'>&nbsp;&nbsp;
<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>

任何人都可以告诉我错误的原因是什么?

8 个答案:

答案 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。