how come php is not writing the image contents to

2019-09-16 05:59发布

问题:

I have some code that uses a multi-part form and HTML5 file object to upload an image (or movie, ppt, etc) to a server, where PHP receives it and writes to disk. However, PHP doesn't appear to be writing to disk at all.

Javascript:

function uploadFile (file, fileid) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            window["fn"+fileid] = xhr.responseText;
            $("progress"+fileid).innerHTML = "<a href=\""+window["fn"+fileid]+"\">"+window["fn"+fileid]+"</a>";
        }
    }
    var a = new Element("div");
    a.id = "progress"+fileid;
    a.setStyle("background-color", "#4682B4");
    a.setStyle("height", "20px");
    a.setStyle("width", "0px");
    $("progress-wrapper").adopt(a);
    xhr.upload.onprogress = function(e, a) {
        var percent = Math.round((e.loaded*150)/e.total);
        var acperct = Math.round(percent/1.5);
        $("progress"+fileid).setStyle("width", percent);
        $("progress"+fileid).innerHTML = file.name+" "+acperct+"%";
    }

    alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNNOPQRSTUVWXYZ1234567890".split("");
    tmp_name = [];
    for (i = 0; i < 6; i++) tmp_name[i] = alpha[Math.floor(Math.random() * alpha.length)];
    xhr.open("POST", "upload.php", true);
    xhr.setRequestHeader("Content-Type", "multipart/form-data");
    xhr.setRequestHeader("size", file.size);
    xhr.setRequestHeader("name", file.name);
    xhr.setRequestHeader("type", file.type);
    xhr.setRequestHeader("tmp_name", ""+tmp_name.join(""));
    xhr.send(file);
}

PHP:

<?
    function apache_request_headers() { 
        foreach($_SERVER as $key=>$value) { 
            if (substr($key,0,5)=="HTTP_") { 
                $key=str_replace(" ","-",ucfirst(strtolower(str_replace("_","_",substr($key,5))))); 
                $out[$key]=$value; 
            }else{ 
                $out[$key]=$value; 
    } 
        } 
        return $out; 
    } 

    $headers = apache_request_headers();
    $contents = file_get_contents("php://input");
    echo $contents;
    $ffilename=$headers["tmp_name"].$headers["name"];
    $all = array('png','jpeg','jpg','gif','mov','txt','wmv','pdf');
    $fh = fopen("upload/".$ffilename, "w+");
    fwrite($fh, $contents);
    fclose($fh);
    echo "upload/".$ffilename;
?>

What happens is that there's either nothing in the written file or the text upload/.

What's wrong?

回答1:

You didn't specify which platform you are running this code on, but if it's unix-based, check the permissions on the upload directory - make sure that write permissions are set for the owner/group that apache runs as. As a quick test, do chmod 0777 upload/ and see if you file shows up.



回答2:

Set the mime type for the file type of the content before you echo it out, e.g. if it's a jpg:

header("Content-type: image/jpg");
echo $contents;

... and just make sure not to echo anything else out. If you see the image, then you know it at least arrived at the server correctly.

Regardless of that, it's not saving the string of characters that you see to the file like it should be. As others have said, check permissions. Also, try this to test the write attempt (after removing the header() call):

$fwrite = fwrite($fh, $contents);
if ($fwrite === false) {
    echo 'write failed';
}
else {
    echo "wrote $fwrite bytes";
}