如何解码并保存从js发送到php的文件

时间:2012-09-18 16:26:44

标签: php file-upload base64 filereader

我有一个拖放上传器。我正在使用文件阅读器发送数据为网址。

    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收到它但是一旦我解码它我就会返回“null”

$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信息直到我解码它。所以,一旦我解码它,我如何确定文件是完整的并且可以保存?

有更好的解码和保存文件的方法吗? 我究竟做错了什么?

提前致谢!

1 个答案:

答案 0 :(得分:2)

在以JSON格式发布时,

$_POST['extension']$_POST['blob']不会神奇地填充到$_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);