直接一步到位
1 命名空间
use think\Env;
2 调用方法
public function downPreservationCert(){
//假设这是远程接口返回的数据
$result = curl_exec($curl);
$results = json_decode($result);
$base64String = $results->data;
//首先将base64编码解码 变为二进制文件
$base64Strings = base64_decode($base64String);
$fileType = '';
//获取文件后缀
$this->getFileType($base64Strings, $fileType);
if ($fileType == 'unknown'){
exit('文件类型识别失败');
}
//拼接文件后缀:生成唯一文件名
$uniqueName = uniqid('app_', true) . $fileType;
//保存文件
$saveDb = $this->uploadBinaryFile($base64Strings, $uniqueName);
exit("文件存放路径为 [ {$saveDb} ]");
}
3 公共方法
/**
* 根据二进制流获取文件类型
* @param $file 文件数据
* @param $fileType 文件后缀
*/
function getFileType($file, &$fileType)
{
// 文件头标识 (2 bytes)
$bin = substr($file,0, 2);
$strInfo = unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
// 文件头对应的文件后缀关联数组
$fileToSuffix = [
255216 => '.jpg',
7173 => '.gif',
6677 => '.bmp',
13780 => '.png',
208207 => '.xls', //注意:doc 文件会识别成 208207
8075 => '.zip', //注意:xlsx文件会识别成 8075
239187 => '.js',
6787 => '.swf',
7067 => '.txt',
7368 => '.mp3',
4838 => '.wma',
7784 => '.mid',
8297 => '.rar',
6063 => '.xml',
];
$fileType = empty($fileToSuffix[$typeCode]) ? 'unknown' : $fileToSuffix[$typeCode];
}
/**
* 上传二进制文件并保存
* @param $data 文件内容
* @param $uniqueName 唯一文件名
* @param string $path 自定义文件保存目录
* @return string
*/
public function uploadBinaryFile($data, $uniqueName, $path = '/beian/')
{
$thinkPath = Env::get('think_path'); //框架应用根目录,命名空间为:use think\facade\Env;
$thinkPath = str_replace('\\', '/', $thinkPath); //把 \\ 替换成 /
$relativePath = 'uploads' . $path . date('Y-m-d') . '/'; //文件存放的相对路径(相对应用根目录)
$saveDb = $relativePath . $uniqueName; //存放到数据表的路径
$savePath = $thinkPath . $saveDb; //文件存放的绝对路径
$mkdirPath = $thinkPath . $relativePath;
if (!is_dir($mkdirPath)) { //文件夹不存在,则创建;并给最大权限 777
mkdir($mkdirPath,0777,true);
chmod($mkdirPath,0777);
}
file_put_contents($savePath, $data); //保存文件
return $saveDb;
}
4 返回结果
文件存放路径为 [ uploads/beian/2023-02-09/app_63e491a3ecac50.23722411.zip ]