我试图弄清楚当我使用$content = file_get_contents("php://input");
接收文件时如何确定文件的扩展名。我使用jQuery将它作为POST请求(xhr)发送到 upload.php 。
我在请求标头中包含文件名,大小和类型,但我不知道如何从file_get_contents()
获取标头。
谢谢!
答案 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