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

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

<?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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 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周前 评论
蜗牛

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

4天前 评论
海彬 (楼主) 4天前

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