почему php не записывает содержимое изображения на диск? - PullRequest
0 голосов
/ 03 марта 2012

У меня есть код, который использует форму из нескольких частей и объект файла HTML5 для загрузки изображения (или фильма, ppt и т. Д.) На сервер, где PHP получает его и записывает на диск.Тем не менее, PHP, похоже, вообще не пишет на диск.

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;
?>

В результате ничего не происходитв письменном файле или тексте upload/.

Что не так?

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Вы не указали, на какой платформе вы запускаете этот код, но если он основан на Unix, проверьте разрешения для каталога загрузки - убедитесь, что права доступа для записи установлены для владельца / группы, под которой работает apache. В качестве быстрого теста выполните chmod 0777 upload/ и посмотрите, появляется ли ваш файл.

1 голос
/ 03 марта 2012

Установите тип mime для типа файла содержимого, прежде чем выводить его, например, если это jpg:

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

... и просто убедитесь, что ничего не выводится.Если вы видите изображение, то вы знаете, что оно, по крайней мере, правильно поступило на сервер.

Независимо от этого, оно не сохраняет строку символов, которую вы видите, в файл таким, каким он должен быть.Как уже говорили другие, проверьте разрешения.Также попробуйте это, чтобы проверить попытку записи (после удаления вызова header ()):

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