拼接,上传和重新组合文件Blob

时间:2017-07-11 23:49:53

标签: javascript php file-upload

我目前正在开发一个结合了Javascript和PHP的上传系统。 Javascript本质上通过拼接 cutoffSize 大小的blob来读取文件(或者,剩余的文件大小,如果更少)。每个拼接都通过Post发送到php脚本。然后,PHP脚本通过blob重新组装文件blob。

但是,在我的实现中(如下所示),输出文件太大。我不确定为什么文件没有正确编写,但我相信我已将问题本地化到php脚本。我的所有javascript测试似乎都成功了。但是,我也包含了Javascript,以防万一。

我认为问题可能在于我编写/追加文件的方式。不幸的是,我不确定如何继续前进,所以我不能进一步调查或更详细地描述。

非常感谢任何帮助。

使用Javascript:

function getBigStringAndPost(files,i,p) {
    var key = $("#keyText")[0].value
    var reader = new FileReader();
    var blob = files[i].slice(p*cutoffSize,Math.min((p+1)*cutoffSize,files[i].size));
    var folderName = $("#folderInput")[0].value;

    reader.onload = function(e) {
        var result = reader.result;
        console.log(result.length);
        $.post("http://brandonquinndixon.com/PHP/uploadFile.php",{
            uploadKey: key,
            doUpload: 1,
            folderName: folderName,
            splitPart: p,
            fileName: files[i].name,
            fileContents: reader.result
        },function(e) {
            console.log(e);
            if ((p+1)*cutoffSize<files[i].size) {
                currentUploaded += cutoffSize;
                updateProgressBar();
                reader.abort();
                getBigStringAndPost(files,i,p+1);
            } else {
                $("#statusDiv").html($("#statusDiv").html()+"<p class='normalP'>File: "+files[i].name+" uploaded successfully.</p>");
                currentUploaded += files[i].size%cutoffSize;
                updateProgressBar();
                reader.abort();
                loadNextFile(files,i+1);
            }
        });
    };

    reader.onerror = function(e) {
        console.log(e);
        totalSizeOfFiles -= files[i].size;
        $("#statusDiv").html($("#statusDiv").html()+"<p class='normalP'>File: "+files[i].name+" could not be read.</p>");
        loadNextFile(files,i+1);
    };

    reader.readAsBinaryString(blob);
}

PHP:

$targetDir = $_SERVER['DOCUMENT_ROOT']."/Downloads";
$getKey = $_POST['uploadKey'];

$data = array();
error_log("upload attempt started");

//first, check the upload key
if ($getKey !== $uploadKey) {
    $data['status'] = "failure";
    $data['message'] = "Incorrect Upload Key";
    error_log("bad key");
} else if ($_POST['doUpload'] == 1) {

    $fileName = "";
    if ($_POST['folderName']!=="") {
        $folderName = cleanInput($_POST['folderName']);
        if (!is_dir($targetDir."/".$folderName)) {
            mkdir($targetDir."/".$folderName, 0777, true);
        }

        $fileName = $targetDir."/".$folderName."/".$_POST['fileName'];
    } else {
        $fileName = $targetDir."/".$_POST['fileName'];
    }

    /*
        Don't allow executables
    */
    if (strpos($fileName,".exe") > -1 || strpos($fileName,".sh") > -1 || strpos($fileName,".deb") > -1 || strpos($fileName,".rpm") > -1) {
        $data['status'] = 'failure';
        $data['message'] = 'Executable type files are not allowed';
    } else {
        if ($_POST['splitPart'] == 0) {
            overWriteFile($fileName,$_POST['fileContents']);
            $data['type'] = 'overWrite';
            $data['details'] = 'P '.$_POST['splitPart'];
        } else {
            appendFile($fileName,$_POST['fileContents']);
            $data['type'] = 'append';
            $data['details'] = 'P '.$_POST['splitPart'];
        }

        $data['status'] = 'success';
    }
} else {
    $data['status'] = 'success';
    $data['type'] = 'none';
    error_log("success, no upload");
}

echo json_encode(array($data));

function overWriteFile($fName,$fContents) {
        $fName = lookupFile($fName);
        $file = fopen($fName,"w");
        fwrite($file,$fContents);
        fclose($file);
    }

    /*
        Append to end of file
    */
    function appendFile($fName,$fContents) {
        $fName = lookupFile($fName);
        //$file = fopen($fName,"a");
        //fwrite($file,$fContents);
        //fclose($file);
        file_put_contents($fName,$fContents,FILE_APPEND);
    }

0 个答案:

没有答案