file = app('\app\Request')->file($name); if (empty($this->file)) { throw new Exception('未找到上传文件的信息'); } // 文件信息 $this->fileInfo = [ 'ext' => $this->file->extension(), 'size' => $this->file->getSize(), 'mime' => $this->file->getMime(), 'name' => $this->file->getOriginalName(), 'realPath' => $this->file->getRealPath(), ]; // 如果是图片文件,进行压缩处理 if ($this->isImageFile()) { $compressedPath = $this->compressImage(); if ($compressedPath) { $this->fileInfo['realPath'] = $compressedPath; $this->fileInfo['size'] = filesize($compressedPath); } } // 生成保存文件名 $this->fileName = $this->buildSaveName(); } /** * 压缩图片 */ protected function compressImage() { // 获取压缩配置(可以从配置文件读取) $quality = ConfigService::get('upload', 'image_quality', 80); $maxWidth = ConfigService::get('upload', 'max_width', 1920); $maxHeight = ConfigService::get('upload', 'max_height', 1080); // 添加调试信息 error_log('开始压缩图片: ' . $this->fileInfo['realPath']); $result = ImageCompressService::compress( $this->fileInfo['realPath'], $quality, $maxWidth, $maxHeight ); if ($result === false) { error_log('图片压缩失败: ' . $this->fileInfo['realPath']); } else { error_log('图片压缩成功: ' . $result); } return $result; } /** * 判断是否为图片文件 */ protected function isImageFile() { $imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp']; return in_array(strtolower($this->fileInfo['ext']), $imageExtensions); } /** * 设置上传的文件信息 * @param string $filePath */ public function setUploadFileByReal($filePath) { // 设置为系统内部上传 $this->isInternal = true; // 文件信息 $this->fileInfo = [ 'name' => basename($filePath), 'size' => filesize($filePath), 'tmp_name' => $filePath, 'error' => 0, ]; // 生成保存文件名 $this->fileName = $this->buildSaveName(); } /** * Notes: 抓取网络资源 * @param $url * @param $key * @author 张无忌(2021/3/2 14:15) * @return mixed */ abstract protected function fetch($url, $key); /** * 文件上传 * @param $save_dir (保存路径) * @return mixed */ abstract protected function upload($save_dir); /** * 文件删除 * @param $fileName * @return mixed */ abstract protected function delete($fileName); /** * 返回上传后文件路径 * @return mixed */ abstract public function getFileName(); /** * 返回文件信息 * @return mixed */ public function getFileInfo() { return $this->fileInfo; } protected function getRealPath() { return $this->fileInfo['realPath']; } /** * 返回错误信息 * @return mixed */ public function getError() { return $this->error; } /** * 生成保存文件名 */ private function buildSaveName() { // 要上传图片的本地路径 $realPath = $this->getRealPath(); // 扩展名 $ext = pathinfo($this->getFileInfo()['name'], PATHINFO_EXTENSION); // 自动生成文件名 return date('YmdHis') . substr(md5($realPath), 0, 5) . str_pad(rand(0, 9999), 4, '0', STR_PAD_LEFT) . ".{$ext}"; } }