由php sys_get_temp_dir()引起的意外令牌“W”JSON.parse(数据)

时间:2014-05-30 17:40:27

标签: javascript php json

我正在尝试使用HTML form.submit()检索文件位置,并且代码完美运行并返回我使用硬编码DIR即'../../asdf/'时所需的信息,但是当我使用PHP构建时在sys_get_temp_dir()中,我在“'Unexpected Token "W"'”行上收到错误data = JSON.parse( data );,我尝试在get_temp_dir函数之后添加斜杠并且不添加斜杠(函数的已知错误) ),它们都产生相同的结果。有什么建议吗?

PHP:

<?php
$failed = false;
$images = array();
$uploadDir = sys_get_temp_dir() . '/';

if ($_SERVER['CONTENT_LENGTH'] < 8380000) 
{
    if (isset($_FILES['filesToUpload']) && $_FILES['filesToUpload']['error'] != 0) 
    {    

            foreach($_FILES['filesToUpload']['tmp_name'] as $key=>$value) 
            {
                    $file = $_FILES['filesToUpload']['name'][$key];
                    // allow only image upload
                    if(preg_match('#image#',$_FILES['filesToUpload']['type'][$key])) 
                    {
                        //$tempFile = tempnam( $uploadDir, $file );

                        if(!move_uploaded_file($value, $uploadDir.$file)) 
                        {
                            $failed = true;
                        } 
                        else 
                        {                    
                            $images[] = $uploadDir . $file;                    
                        }    
                    } 
                    else 
                    {
                        $images = array("error"=>"Sorry, only images are allowed to upload");
                    }
            }
    }
} 
else 
{
    $images = array("error"=>"Sorry, Upload size exceed allowed upload size of 8MB");
}
if($failed == true) 
{
    $images = array("error"=>"Server Error<br/>Reported to Admin");
}
?>


<html>
 <body>
  <script type="text/javascript">
  window.parent.Uploader.done('<?php echo json_encode($images); ?>');
  </script>
 </body>
</html>

使用Javascript:

var Uploader = (function () 
    {

        jQuery('#UploadFiles').on('change', function () 
        {
            jQuery('#UploadFiles').parent('form').submit();
        });

        var fnUpload = function () 
        {
            jQuery('#UploadFiles').trigger('click');
        }

        var fnDone = function (data) 
        {
            alert( data );
            var data = JSON.parse(data); //ERROR THROWN HERE.

            if (typeof (data['error']) != "undefined") 
            {
                jQuery('#UploadedImages').html(data['error']);
                jQuery('#UploadFiles').val("");
                return;
            }
            var pics = [];
            for ( var i = 0; i < data.length; i++ ) 
            {
                pics.push("<img class='hidden' src='" + data[i] + "'/>");
            }

            modifyPictures( data );
            jQuery('#UploadedImages').html(pics.join(""));
            jQuery('#UploadFiles').val("");
            $('#gallery').pikachoose();
        }

        return( 
        {
            upload: fnUpload,
            done: fnDone
        })

    }());

警报的结果:

["C:\Windows\TEMP/pause.png","C:\Windows\TEMP/thumb-back.png"]

1 个答案:

答案 0 :(得分:0)

正如Felix Kling指出的那样,&#39; \&#39; sys_get_temp_dir()生成的字符不会在json_encode函数中替换,因此会导致JSON.parse()函数爆炸。这是我用来解决问题的循环(也用不同的字符处理其他几个类似的问题)。

$images = escapeJsonString( $images );

function escapeJsonString( $value ) 
{
    # list from www.json.org: (\b backspace, \f formfeed)    
    $escapers =     array("\\",     "/",   "\"",  "\n",  "\r",  "\t", "\x08", "\x0c");
    $replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t",  "\\f",  "\\b");
    $result = str_replace($escapers, $replacements, $value);
    return $result;
}

echo json_encode( $images );