JS / PHP ajax 发布 Blob

JS / PHP ajax posting Blob

我正在测试 AJAX 文件上传,我希望最终能够使用图像进行上传,但现在我很高兴能够使用文本文件。我会在下面放一段我的代码。

JS

var blob //creates blob global variable.

//reads in blob to blob global var on change of file input. 
function readBlob(evt){

    var files = evt.target.files;
    if(!files.length){
        alert("no file");
        return;
    }

    var file = files[0];    
    var reader = new FileReader();

    reader.onloadend = function(evt){
        if (evt.target.readyState == FileReader.DONE){
            document.getElementById("jsReturnDiv").textContent = evt.target.result;
            blob = new Blob([evt.target.result], {type: 'text/plain'});
        }
    };

    reader.readAsBinaryString(file);
}


function post(){
    var i = 0;
    xhr.open("POST","what.php",true);
    xhr.setRequestHeader("content-type","text/plain");
    xhr.onreadystatechange = function(){
        if(xhr.status == 200 && xhr.readyState == 4){
            callback(xhr.responseText);
        }
        log(i,xhr.responseText);
        i++;
    }
    xhr.send(blob);
}

function callback(text){                                        //HUEHUEHUE
    document.getElementById("phpReturnDiv").innerHTML = text + "</br>___encoded</br>" + jsVarDump(blob) //+ "</br>___decoded</br>" + jsVarDump(decodeURIComponent(blob));
}

function log(index, text){
    console.log("index:"+index+"_______________________\n"+text);
}

PHP

<?php
var_dump($_POST);
?>

我遇到的问题是 php 的输出总是:

array(0) { }

我想知道我做错了什么很明显。文件被解释为二进制字符串,并被送入内容类型为 text/plain 的 blob object,然后发布为 text/plain。

我应该在我的 XHR object 中使用不同的 content-type header 吗?我是否错误地处理了 blob?

谢谢!

您必须阅读 php://input 才能从内容类型为 text/plain 的 post 中获取数据。 $_POST 仅填充 application/x-www-form-urlencodedmultipart/form-data

$text = file_get_contents('php://input');