| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- <?php
- namespace app\weixin\model;
- use cmf\lib\Upload;
- use think\Model;
- use think\Request;
- class Stroage extends Model
- {
- /**
- * 上传图片
- * @param $formId 图片表单名称
- * @param $scene 应用场景
- * @return array|string
- */
- public static function uploadImg($file, $scene = 'default')
- {
- $data = [];
- $path = "upload/{$scene}";
- if (!is_dir($path)) {
- mkdir($path, 0755, true);
- }
- $fileSize = config('files.imageSize');
- $fileSize = $fileSize ? $fileSize * 1024 * 1024 : 10 * 1024 * 1024;
- $info = $file->validate(['size' => $fileSize, 'ext' => 'jpg,jpeg,png,gif'])->move('./' . $path);
- if ($info) {
- $filename = str_replace('\\', '/', $info->getSaveName());
- $fileInfo = $info->getInfo();
- $name = isset($fileInfo['name']) ? $fileInfo['name'] : '';
- $fileType = cmf_get_file_extension($name);
- $data = [
- 'name' => $name,
- 'file' => "{$scene}/" . $filename,
- 'preview' => cmf_get_image_preview_url("{$scene}/" . $filename),
- 'file_type' => $fileType,
- 'file_size' => isset($fileInfo['size']) ? getFileSize($fileInfo['size']) : 0,
- 'md5_key' => md5_file(cmf_get_image_preview_url("{$scene}/" . $filename)),
- 'total_page' => 1,
- ];
- } else {
- return $info;
- }
- return $data;
- }
- /**
- * 上传base图片
- * @param $baseList
- * @param string $scene
- * @return bool|int|string
- */
- public static function uploadBaseImg($baseList, $scene = 'default')
- {
- $data = [];
- $path = "{$scene}/" . date('Ymd') . '/';
- foreach ($baseList as $k => $item) {
- if (!is_dir('/public/' . $path)) {
- mkdir('/public/' . $path, 755, true);
- }
- $filename = $path . 'P_' . md5(uniqid() . time() . $k) . '.jpg';
- $src = isset($item['src']) ? $item['src'] : '';
- if ($src && !preg_match("/default//", $src) && file_put_contents('/public/' . $filename, $src)) {
- $data[] = [
- 'name' => isset($item['name']) ? trim($item['name']) : '',
- 'url' => $filename,
- 'nums' => isset($item['nums']) ? intval($item['nums']) : 1,
- 'total_page' => 1,
- 'file_size' => isset($item['file_size']) ? intval($item['file_size']) : 0,
- 'file_type' => isset($item['file_type']) ? ltrim($item['file_type'], 'image/') : '',
- 'type' => isset($item['type']) ? trim($item['type']) : '',
- 'md5_key' => md5_file(cmf_get_image_preview_url($filename)),
- 'created_at' => date('Y-m-d H:i:s')
- ];
- }
- }
- if ($data) {
- return FileLogs::insertAll($data);
- } else {
- return false;
- }
- }
- /**
- * 上传图片
- * @param $formId 图片表单名称
- * @param $scene 应用场景
- * @return array|string
- */
- public static function uploadFile($file, $scene = 'default')
- {
- $data = [];
- $path = "upload/files/{$scene}";
- if (!is_dir($path)) {
- mkdir($path, 0755, true);
- }
- $fileTypes = config('files.fileTypes');
- $fileSize = config('files.fileSize');
- $fileSize = $fileSize ? $fileSize * 1024 * 1024 : 30 * 1024 * 1024;
- $fileTypes = $fileTypes ? $fileTypes : ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
- $info = $file->validate(['size' => $fileSize, 'ext' => implode(',', $fileTypes)])->move('./' . $path);
- if ($info) {
- $filename = str_replace('\\', '/', $info->getSaveName());
- $fileInfo = $info->getInfo();
- $name = isset($fileInfo['name']) ? $fileInfo['name'] : '';
- $fileType = cmf_get_file_extension($name);
- $file = "files/{$scene}/" . $filename;
- if (Stroage::checkFileExists($file)) {
- $page = Stroage::getFilePage($file);
- if (in_array($fileType, ['xls', 'xlsx'])) {
- $file = str_replace('.' . $fileType, '.pdf', $file);
- }
- $data = [
- 'name' => $name,
- 'file' => $file,
- 'preview' => cmf_get_image_preview_url($file),
- 'file_type' => $fileType,
- 'file_size' => isset($fileInfo['size']) ? getFileSize($fileInfo['size']) : 0,
- 'md5_key' => md5_file(cmf_get_image_preview_url($file)),
- 'total_page' => $page,
- ];
- }
- }
- return $data;
- }
- /**
- * 验证上传文件是否存在
- * @param $file
- * @return bool
- */
- public static function checkFileExists($file)
- {
- $file = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- return is_file($file);
- }
- /**
- * 打包文件为ZIP
- * @param $file 文件
- * @param $fileType
- * @return mixed
- */
- public static function makeZipFile($file, $fileType)
- {
- $filename = str_replace('.' . $fileType, '.zip', $file);
- $zip = new \ZipArchive();
- $file = UPLOAD_PATH . $file;
- $zip->open(UPLOAD_PATH . $filename, \ZipArchive::CREATE); //打开压缩包
- $zip->addFile($file, basename($file)); //向压缩包中添加文件
- $zip->close(); //关闭压缩包
- return $filename;
- }
- /**
- * 修改文件后缀为zip压缩包
- * @param $file 文件
- * @param $fileType 文件类型
- * @return bool|mixed
- */
- public static function moveFileToZip($file, $fileType = '')
- {
- $fileType = getFileType($file);
- $file = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- $filename = str_replace('.' . $fileType, '.zip', $file);
- if (copy($file, $filename)) {
- return str_replace('\\', '/', $filename);;
- }
- return false;
- }
- /**
- * 解压读取ZIP内指定文件
- * @param $file ZIP压缩文件
- * @return bool|string
- */
- public static function getZipPageFile($file)
- {
- $zip = new \ZipArchive();
- $file = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- // 中文文件名要使用ANSI编码的文件格式
- if ($zip->open($file) === TRUE) {
- //提取全部文件
- $file = str_replace('.zip', '', $file);
- $zip->extractTo($file); //提取部分文件
- $zip->close();
- return str_replace('\\', '/', $file . '/docProps/app.xml');
- } else {
- return false;
- }
- }
- /**
- * 删除文件
- * @param $file
- */
- public static function deleteFile($file)
- {
- $file = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- if (is_file($file)) {
- unlink($file);
- }
- }
- /**
- * 删除ZIP压缩包以及其解压文件
- * @param $file 压缩奥文件
- */
- public static function deleteZip($file)
- {
- if (is_file($file)) {
- Stroage::deleteFile($file);
- }
- $zipDir = str_replace('.zip', '', $file);
- if (is_dir($zipDir)) {
- deleteDir($zipDir);
- }
- }
- /**
- * 获取文档页数
- * @param $file 文件
- * @return int
- */
- public static function getFilePage($file)
- {
- set_time_limit(0);
- $fileType = getFileType($file);
- // PDF 类型文件
- if (in_array($fileType, ['pdf'])) {
- return Stroage::getPdfFilePage($file);
- }
- // 表格文件转PDF
- $typeData = config('files.convertTypes');
- $typeData = $typeData ? array_keys($typeData) : ['doc','docx', 'xls', 'xlsx', 'ppt', 'pptx'];
- if (in_array($fileType, $typeData)) {
- if($fileType == 'docx'){
- $file = Stroage::convertFile($file,'doc');
- }
- $file = Stroage::onLineConvertFile($file);
- return Stroage::getPdfFilePage($file);
- }
- // 其他文件
- $fileTypes = config('files.fileTypes');
- $fileTypes = $fileTypes ? $fileTypes : ['txt', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf'];
- if (!in_array($fileType, $fileTypes)) {
- return 0;
- }
- $zipFile = Stroage::moveFileToZip($file);
- if (!is_file($zipFile)) {
- return 0;
- }
- // 获取页数文件内容
- $pageFile = Stroage::getZipPageFile($zipFile);
- if (!is_file($pageFile)) {
- return 0;
- }
- $content = file_get_contents($pageFile);
- if (empty($content)) {
- return 0;
- }
- preg_match("/(<Pages>([1-9][0-9]*):?<\/Pages>)|(<Slides>([1-9][0-9]*):?<\/Slides>)|(<vt:i4>([1-9][0-9]*):?<\/vt:i4>)/", $content, $result);
- $page = $result ? intval(end($result)) : 0;
- // 删除处理生成临时压缩包文件
- $deleteTemp = config('print.deleteTemp');
- if ($deleteTemp) {
- Stroage::deleteZip($zipFile);
- }
- return $page;
- }
- /**
- * 文件服务器转换
- * @param $file 文件
- * @param string $type 转换类型
- * @return mixed
- */
- public static function convertFile($file, $type = 'pdf')
- {
- $fileType = getFileType($file);
- $pathFile = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- $path = dirname($pathFile) . '/';
- $filename = str_replace('.' . $fileType, '.' . $type, $file);
- switch ($type) {
- case 'pdf':
- $command = "libreoffice6.3 --invisible --convert-to pdf --outdir \"{$path}\" \"{$pathFile}\"";
- exec($command);
- break;
- case 'doc':
- $command = "libreoffice6.3 --invisible --convert-to doc --outdir \"{$path}\" \"{$pathFile}\"";
- exec($command);
- break;
- }
- return $filename;
- }
- /**
- * 图片转黑白
- * @param $file
- * @return string
- */
- public static function filtterColor($file, $type=1, $light=6)
- {
- $filepath = dirname($file);
- $newFile = $filepath . '/color_' . basename($file);
- if (!file_exists('upload/' . $file)) {
- return false;
- }
- @fopen('upload/' . $newFile, 'w+');
- $im = imagecreatefromjpeg('upload/' . $file);
- if ($im && imagefilter($im, 1)) {
- imagefilter($im, 2, $light);
- // imagefilter($im, 4, 0,0,0);
- imagepng($im, 'upload/' . $newFile);
- } else {
- $newFile = '';
- }
- imagedestroy($im);
- return $newFile;
- }
- /**
- * 文件在线转换
- * @param $file 文件
- * @return mixed
- */
- public static function onLineConvertFile($file, $type='pdf')
- {
- $fileType = getFileType($file);
- $pathFile = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- $path = dirname($pathFile) . '/';
- $filename = str_replace('.' . $fileType, '.'.$type, $file);
- $typeData = config('files.convertTypes');
- $minType = isset($typeData[$fileType]) ? $typeData[$fileType] : '';
- if (empty($minType)) {
- return false;
- }
- $name = basename($filename);
- if (!class_exists('CURLFile')) {
- return false;
- }
- $convertApi = config('files.convertApi');
- $convertApiUrl = isset($convertApi['convert']) ? $convertApi['convert'] : '';
- if (empty($convertApiUrl)) {
- return false;
- }
- // 转换
- $postData = file_get_contents($pathFile);
- $result = httpHeaderRequest($convertApiUrl, $postData, ["fileName:{$name}","content-Type:{$minType}"]);
- $errorCode = isset($result['errorCode']) ? intval($result['errorCode']) : 1;
- $status = isset($result['status']) ? intval($result['status']) : 0;
- $convertId = isset($result['data']) ? $result['data'] : '';
- if ($errorCode != 0 || empty($convertId) || $status) {
- return false;
- }
- // 下载
- $downloadApiUrl = isset($convertApi['download']) ? $convertApi['download'] : '';
- if (empty($downloadApiUrl)) {
- return false;
- }
- $downloadApiUrl = sprintf($downloadApiUrl, $convertId);
- $content = httpRequest($downloadApiUrl, '', 'get', 'text', 120);
- if (empty($content)) {
- return false;
- }
- // 另存
- $downloadFile = str_replace('.' . $fileType, '.pdf', $pathFile);
- file_put_contents($downloadFile, $content);
- return $filename;
- }
- /**
- * 读取PDF文件页数
- * @param $file 文件
- * @return bool|int
- */
- public static function getPdfFilePage($file)
- {
- $file = preg_match("/^files/", $file) ? UPLOAD_PATH . $file : $file;
- if (!is_readable($file) || !file_exists($file)) {
- return 0;
- }
- $max = 0;
- $fp = @fopen($file, "r");
- if (!$fp) {
- return 0;
- }
- while (!feof($fp)) {
- $line = fgets($fp, 255);
- if (preg_match('/\/Count [0-9]+/', $line, $matches)) {
- preg_match('/[0-9]+/', $matches[0], $matches2);
- if ($max < $matches2[0]) $max = $matches2[0];
- }
- }
- fclose($fp);
- return $max;
- }
- }
|