2012-03-03 1 views
0

私はPHPがそれを受け取ってディスクに書き込むサーバーに画像(またはムービー、pptなど)をアップロードするために、マルチパート形式とHTML5ファイルオブジェクトを使用するコードをいくつか持っています。しかし、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/のいずれかがないということです。

どういうところが間違っていますか?

+1

は、あなたがちょうどあなたが何を期待受け取ったことを確認し、受信した内容をエコーバックしようとしていますか?受信の問題かもしれません。 – MyStream

+0

私はエコーバックしてから、 'alert'してみました。ランダムなASCII文字で表示されます。バイナリ。 – tekknolagi

+0

をデバッグするには、var_dump()を実行して$ fhを実行し、そこにエラーがあるかどうかを確認してください。また、ファイル名が書き込み可能かどうかを確認し、error_reporting()をオンにします。それはおそらく、エラーが消されて黙って失敗している可能性があります。 – MyStream

答えて

2

このコードを実行しているプラ​​ットフォームは指定していませんが、UNIXベースの場合は、アップロードディレクトリのアクセス許可を確認してください。 - Apacheが実行する所有者/グループの書き込み権限が設定されていることを確認してください。クイックテストとして、chmod 0777 upload/を実行し、ファイルが表示されるかどうかを確認してください。

+0

UNIXベースで、これを試してみます。 – tekknolagi

+0

ありがとう!出来た! – tekknolagi

1

コンテンツをエコーする前に、コンテンツのファイルタイプにMIMEタイプを設定します(例:それがjpgの場合:

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

...他に何もエコーしないようにしてください。イメージを見ると、少なくともサーバーに正しく到着したことがわかります。

それにかかわらず、表示する文字列をファイルに保存する必要はありません。他の人が言ったように、パーミッションをチェックしてください。また、(ヘッダ()呼び出しを除去した後)、書き込みの試みをテストするには、この方法を試してください。

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