Alex Rivera | Logout

$_SERVER["CONTENT_LENGTH"] returning zero when uploading a file using XmlHttpRequest

Asked 2010-09-08T03:45:41.453
9

I'm having an issue on my development machine which seems isolated to this machine and I can't figure it out. I have a jQuery file uploader which posts the user-selected file to a PHP script for handling using XmlHttpRequest. The script works fine on my MacBook Pro running OSX10.6.3 with MAMP 1.9, however on my iMac with the exact same operating system and version of MAMP, with an identical server image, it fails.

I have traced the cause of the error down to the property $_SERVER["CONTENT_LENGTH"] returning0, even though I can get the filename just fine and everything else seems to have succeeded about the request. For some reason it just won't seem to give me the actual content length. Here is the code that is causing the problem - the function in question is getSize().

class qqUploadedFileXhr {
    /**
     * Save the file to the specified path
     * @return boolean TRUE on success
     */
    function save($path) {    
        $input = fopen("php://input", "r");
        $temp = tmpfile();
        $realSize = stream_copy_to_stream($input, $temp);
        fclose($input);

        if ($realSize != $this->getSize()){            
            return false;
        }

        $target = fopen($path, "w");        
        fseek($temp, 0, SEEK_SET);
        stream_copy_to_stream($temp, $target);
        fclose($target);

        return true;
    }
    function getName() {
        return $_GET['qqfile'];
    }
    function getSize() {
        if (isset($_SERVER["CONTENT_LENGTH"])){
            return (int)$_SERVER["CONTENT_LENGTH"]; //*THIS* is returning 0            
        } else {
            throw new Exception('Getting content length is not supported.');
        }      
    }   
}
Edit
Report

1 Answer

3

It's possible that chunked encoding is being used, which wouldn't send content length.

answered 2011-11-09T00:43:00.213

Your Answer