通过接收文件流来上传文件,请问如何准确判断文件后缀

这是网上看到的通过识别文件信息来区分

<?php
$data = file_get_contents('php://input');
$strInfo = @unpack("C2chars", substr($data,0,2));
$typeCode = intval($strInfo["chars1"].$strInfo["chars2"]);
$fileTypes = array(
  7790 => "exe",
  7784 => "midi",
  8075 => "zip",
  8297 => "rar",
  225216 => "jpg",
  7173 => "gif",
  6677 => "bmp",
  13780 => "png",
);
$fileType = isset($fileTypes[$typeCode]) ? $fileTypes[$typeCode] : "unknown";
echo "type : {$fileType} code : {$fileType}";

?>

上传的文件是xlsx文件识别出来的$typeCode 和zip 文件的$typeCode 是一样的,都是8075。这样我在保存文件的时候给文件后缀名就不知怎么去区分这个文件到底是什么后缀了。

勿以恶小而为之,勿以善小而不为
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 10

pathinfo() 可以获取文件信息,如 pathinfo("1.php")

1年前 评论
钟海彬 (楼主) 1年前
fatrbaby
$mime = mime_content_type('your-file-path');

$extension = match($mime) {
...
};

rename('your-file-path', 'your-file-path.' . $extension);
1年前 评论
xiaochong0302

你可以使用一个偷懒的做法,把流写入临时文件,再用上面提到的方法读取信息,再把临时文件删除

1年前 评论

模拟php的正常上传,先存临时文件,读取使用后再删除

1年前 评论
jiangjun

xlsx文件其实就是zip压缩包,这种不用文件流接收呢,或者前端把文件名传上来

1年前 评论

我的判断是否为表格

if (!str_contains($file->getClientOriginalName(), 'xlsx') && !str_contains($file->getClientOriginalName(), 'xls')) {
            return response()->json(['code' => 500, 'message' => '请选择正确的文件类型,目前仅支持 xlsx 和 xls 类型文件']);
        }
1年前 评论
mouyong

github.com/mouyong/php-support/blo... 这两个函数能帮到你

1年前 评论
钟海彬 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!