2012-03-03 5 views
0

PHP가 이미지를 받거나 디스크에 쓴 서버에 이미지 (또는 영화, ppt 등)를 업로드하기 위해 다중 부분 양식과 HTML5 파일 객체를 사용하는 코드가 있습니다. 그러나 PHP는 디스크에 전혀 쓰지 않는 것처럼 보입니다.PHP가 이미지 내용을 디스크에 쓰지 않는 이유는 무엇입니까?

자바 스크립트 :

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/ 중 하나가 없습니다 것입니다.

무엇이 잘못 되었나요?

+1

수신 한 내용을 에코하여 예상 한 결과를 얻었습니까? 수신 문제 일 수 있습니다. – MyStream

+0

나는 반향을 시도한 후'경고 '를 시도했는데 그것은 임의의 ASCII 문자로 나타난다. 바이너리. – tekknolagi

+0

을 디버깅하려면 var_dump()를 실행하여 $ fh를 시도하고 거기에 오류가 있는지 확인하십시오. 또한 파일 이름이 쓰기 가능인지보고 error_reporting()을 켭니다. 그것은 아마도 오류가 꺼지면서 조용히 실패 할 가능성이 높습니다. – MyStream

답변

2

이 코드를 실행하는 플랫폼을 지정하지 않았지만 유닉스 기반 인 경우 업로드 디렉토리의 권한을 확인하십시오. - 아파치가 실행되는 소유자/그룹에 대한 쓰기 권한이 설정되어 있는지 확인하십시오. 빠른 테스트로서 chmod 0777 upload/을 실행하고 파일이 표시되는지 확인하십시오.

+0

유닉스 기반으로 시도해 볼 것입니다. – tekknolagi

+0

고마워요! 그것은 효과가있다! – tekknolagi

1

콘텐츠를 에코하기 전에 콘텐츠의 파일 형식에 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"; 
} 
관련 문제