2012-09-18 27 views
1

我有一個拖放上傳器。我正在使用文件讀取器將數據發送爲URL。如何解碼並保存從js發送到php的文件

var files = evt.dataTransfer.files; 
for (var i = 0, f; f = files[i]; i++) { 
    var start = 0; 
    var stop = files[0].size - 1; 
    var reader2 = new FileReader(); 
    var ext = f.name.substring(f.name.indexOf(".")+1); 
    reader2.onloadend = function(evt) { 
     if (evt.target.readyState == FileReader.DONE) { // DONE == 2 
      $.post("/process/upload.php",{"blob":evt.target.result,"extension":ext},function(data){ 
       console.log(data); 
      }); 
     } 
    }; 
var blob = f.slice(start, stop + 1); 
reader2.readAsDataURL(blob); 
} 

PHP臨危它,但一旦我對其進行解碼,我得到 「空」 返回

$extension = $_POST['extension']; 
$file = base64_decode($_POST['blob']); 
$filePath = "../tmp/monkey.".$extension; 
echo json_encode(base64_decode($_POST['blob'])); 

我也試過:

if(file_put_contents($filePath,$file)){ 
    echo json_encode("it worked"); 
}else{ 
    echo json_encode("it failed"); 
} 

編輯:我維持POST信息一路直到我解碼它。所以一旦我解碼它,我如何確定文件是完整的,可以保存?

有解碼和保存文件的更好方法嗎? 我究竟做錯了什麼?

在此先感謝!

回答

2

$_POST['extension']$_POST['blob']當以JSON格式發佈時,不會神奇地將其填充到$_POST數組中。事實上,根據您的JSON格式,JSON將解碼爲一個對象,而不是數組。

您將需要直接從輸入獲得的內容是這樣的:

$post = file_get_contents('php://input'); 
$post_obj = json_decode($post); 
$extension = $post_obj->extension; 
$file = base64_decode($post_obj->blob); 

或者使用$HTTP_RAW_POST_DATA變量,如:

$post_obj = json_decode($HTTP_RAW_POST_DATA); 
$extension = $post_obj->extension; 
$file = base64_decode($post_obj->blob); 
+0

感謝您的快速答覆。我嘗試了兩個版本,我仍然收到null或一個空字符串。 –

+0

什麼值給null?你可以var_dump($ HTTP_RAW_POST_DATA,file_get_contents('php:// input'))'看看你是否得到了預期的結果? –

+0

當我回顯file_get_contents('php:// input');我得到了base64 +的擴展名,當我回顯$文件時,我得到一個空字符串。當我回顯$ post_obj時,我得到Null。 –

相關問題