通过file_get_contents从文件上传到php文件获取扩展和大小

时间:2014-03-21 19:44:07

标签: php jquery xmlhttprequest file-get-contents

我试图弄清楚当我使用$content = file_get_contents("php://input");接收文件时如何确定文件的扩展名。我使用jQuery将它作为POST请求(xhr)发送到 upload.php

我在请求标头中包含文件名,大小和类型,但我不知道如何从file_get_contents()获取标头。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是使用测试文件的工作示例。在您的示例中替换$content中的$content = file_get_contents()。您可以找到其他文件类型here的签名。我选择将前12个字符转换为每个文件的十六进制。如果您有更长的文件签名,则可以增加该数量。对于文件大小,您可以使用strlen($content)或尝试filesize("php://input")

<?php
    $content = file_get_contents("testjpg.jpg");
    $a = strToHex($content, 12);
    var_dump($a);
    echo getfiletype($a) . "<br>";

    $content = file_get_contents("testdoc.doc");
    $a = strToHex($content, 12);
    var_dump($a);
    echo getfiletype($a) . "<br>";

    $content = file_get_contents("testpdf.pdf");
    $a = strToHex($content, 12);
    var_dump($a);
    echo getfiletype($a) . "<br>";


function getfiletype($test){
    if (testsig($test, "FF D8 FF")){
        return "jpeg";
    }
    elseif (testsig($test, "25 50 44 46")){
        return "pdf";
    }
    elseif (testsig($test, "D0 CF 11 E0 A1 B1 1A E1")){
        return "doc";
    }
    else{
        return "unknown";
    }
}

function testsig($test, $sig){
    // remove spaces in sig
    $sig = str_replace(" ","", $sig);
    if (substr($test, 0, strlen($sig)) == $sig){
            return true;
    }
    return false;
}



function strToHex($string, $stop=null){
    $hex = "";
    if ($stop == null){
        $stop = strlen($string);
    }
    $stop = min(strlen($string), $stop);

    for ($i=0; $i<$stop; $i++){
        $ord = ord($string[$i]);
        $hexCode = dechex($ord);
        $hex .= substr('0'.$hexCode, -2);
    }
    return strtoupper($hex);
}
?>

代码的结果是:

string 'FFD8FFE1034D457869660000' (length=24)

jpeg

string 'D0CF11E0A1B11AE100000000' (length=24)

doc

string '255044462D312E360D25E2E3' (length=24)

pdf