1, 'document' => 2, 'video' => 3, 'audio' => 4 ]; // 允许的文件类型 protected $allowedExtensions = [ 'image' => ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'], 'document' => ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'], 'video' => ['mp4', 'webm', 'mov'], 'audio' => ['mp3', 'wav', 'ogg'] ]; // 获取所有文件 public function getAllFiles() { try { $page = Request::param('page/d', 1); $pageSize = Request::param('pageSize/d', 10); $cate = Request::param('cate/d', 0); $keyword = Request::param('keyword/s', ''); $query = Files::where('delete_time', null); if ($cate) { $query->where('cate', $cate); } if ($keyword) { $query->whereLike('name', "%{$keyword}%"); } $total = $query->count(); $list = $query->page($page, $pageSize) ->order('create_time', 'desc') ->select(); return json([ 'code' => 200, 'msg' => 'success', 'data' => [ 'list' => $list, 'total' => $total, 'page' => $page, 'pageSize' => $pageSize ] ]); } catch (\Exception $e) { return json([ 'code' => 500, 'msg' => '获取文件列表失败: ' . $e->getMessage() ]); } } //获取用户分类 public function getUserCate() { try { $cate = FilesCategory::where('delete_time', null)->field('id,name')->select(); // 获取每个分类下的文件数量 foreach ($cate as &$c) { $c['total'] = Files::where('cate', $c['id'])->where('delete_time', null)->count(); } return json([ 'code' => 200, 'msg' => 'success', 'data' => $cate ]); } catch (\Exception $e) { return json([ 'code' => 500, 'msg' => '获取用户分类失败: ' . $e->getMessage() ]); } } //新建文件分组 public function createFileCate() { try { $data = Request::param(); $data['create_time'] = date('Y-m-d H:i:s'); $id = FilesCategory::insertGetId($data); // 记录操作日志 $this->logSuccess('文件管理', '创建文件分组', ['id' => $id]); return json([ 'code' => 200, 'msg' => '新建文件分组成功', 'data' => [ 'id' => $id ] ]); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '创建文件分组', $e->getMessage()); return json([ 'code' => 500, 'msg' => '新建文件分组失败: ' . $e->getMessage() ]); } } //重命名文件分组 public function renameFileCate($id) { try { $data = Request::param(); $result = FilesCategory::where('id', $id)->update(['name' => $data['name']]); // 记录操作日志 $this->logSuccess('文件管理', '重命名文件分组', ['id' => $id]); return json([ 'code' => 200, 'msg' => '重命名文件分组成功' ]); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '重命名文件分组', $e->getMessage()); return json([ 'code' => 500, 'msg' => '重命名文件分组失败: ' . $e->getMessage() ]); } } //删除文件分组 public function deleteFileCate($id) { try { $result = FilesCategory::where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]); // 记录操作日志 $this->logSuccess('文件管理', '删除文件分组', ['id' => $id]); return json([ 'code' => 200, 'msg' => '删除文件分组成功' ]); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '删除文件分组', $e->getMessage()); return json([ 'code' => 500, 'msg' => '删除文件分组失败: ' . $e->getMessage() ]); } } //获取分类文件 public function getCateFiles(int $id) { try { $page = Request::param('page/d', 1); $pageSize = Request::param('pageSize/d', 10); $keyword = Request::param('keyword/s', ''); $query = Files::where('cate', $id)->where('delete_time', null); if ($keyword) { $query->whereLike('name', "%{$keyword}%"); } $list = $query->page($page, $pageSize) ->order('create_time', 'desc') ->select(); // 格式化文件信息 foreach ($list as &$file) { $file['createTime'] = $file['create_time']; $file['groupId'] = $file['cate']; $file['url'] = $file['src']; } return json([ 'code' => 200, 'msg' => 'success', 'data' => [ 'list' => $list, 'page' => $page, 'pageSize' => $pageSize, 'categoryId' => $id ] ]); } catch (\Exception $e) { return json([ 'code' => 500, 'msg' => '获取分类文件失败: ' . $e->getMessage() ]); } } public function uploadFile() { try { $file = Request::file('file'); if (!$file) { return json(['code' => 400, 'msg' => '请选择要上传的文件']); } // 验证文件大小和类型 $maxSize = 50 * 1024 * 1024; // 50MB $fileExt = strtolower($file->getOriginalExtension()); if ($file->getSize() > $maxSize) { return json(['code' => 400, 'msg' => '文件大小不能超过50MB']); } // 计算文件MD5 $fileMd5 = md5_file($file->getRealPath()); // 检查是否已存在相同文件 $existFile = Files::where('md5', $fileMd5)->where('delete_time', null)->find(); if ($existFile) { return json([ 'code' => 201, 'msg' => '文件已存在', 'data' => [ 'url' => $existFile['src'], 'id' => $existFile['id'], 'name' => $existFile['name'] ] ]); } // 确定文件类型 $fileType = 2; // 默认为文件 foreach ($this->allowedExtensions as $type => $extensions) { if (in_array($fileExt, $extensions)) { $fileType = $this->fileTypes[$type]; break; } } $cate = Request::param('cate/d', 0); // 生成按日期分类的目录结构 $datePath = date('Y/m/d'); $saveName = $datePath . '/' . uniqid() . '.' . $fileExt; $fullPath = Filesystem::disk('public')->putFileAs('uploads', $file, $saveName); $fileUrl = '/storage/' . str_replace('\\', '/', $fullPath); // 获取当前登录用户ID $userId = Request::middleware('user_id', ''); // 保存文件信息到数据库 $fileData = [ 'name' => $file->getOriginalName(), 'type' => $fileType, 'cate' => $cate, 'size' => $file->getSize(), 'src' => $fileUrl, 'md5' => $fileMd5, 'uploader' => $userId, 'create_time' => date('Y-m-d H:i:s'), ]; $fileId = Files::insertGetId($fileData); // 记录操作日志 $this->logSuccess('文件管理', '上传文件', ['id' => $fileId]); return json([ 'code' => 200, 'msg' => '上传成功', 'data' => [ 'url' => $fileUrl, 'id' => $fileId, 'name' => $fileData['name'] ] ]); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '上传文件', $e->getMessage()); return json([ 'code' => 500, 'msg' => '上传失败: ' . $e->getMessage() ]); } } // 更新文件信息 public function updateFile($id) { try { $data = Request::only(['name', 'cate']); if (empty($data)) { return json(['code' => 400, 'msg' => '无更新数据']); } $data['update_time'] = date('Y-m-d H:i:s'); $result = Files::where('id', $id)->where('delete_time', null)->update($data); if ($result) { // 记录操作日志 $this->logSuccess('文件管理', '更新文件', ['id' => $id]); return json(['code' => 200, 'msg' => '更新成功']); } return json(['code' => 404, 'msg' => '文件不存在']); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '更新文件', $e->getMessage()); return json(['code' => 500, 'msg' => '更新失败: ' . $e->getMessage()]); } } // 删除文件 public function deleteFile($id) { try { $result = Files::where('id', $id)->update(['delete_time' => date('Y-m-d H:i:s')]); if ($result) { // 记录操作日志 $this->logSuccess('文件管理', '删除文件', ['id' => $id]); return json(['code' => 200, 'msg' => '删除成功']); } return json(['code' => 404, 'msg' => '文件不存在']); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '删除文件', $e->getMessage()); return json(['code' => 500, 'msg' => '删除失败: ' . $e->getMessage()]); } } // 下载文件 public function download($id) { try { $file = Files::where('id', $id)->where('delete_time', null)->find(); if (!$file) { return json(['code' => 404, 'msg' => '文件不存在']); } $filePath = public_path() . $file['src']; if (!file_exists($filePath)) { return json(['code' => 404, 'msg' => '文件不存在']); } return download($filePath, $file['name']); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '下载文件', $e->getMessage()); return json(['code' => 500, 'msg' => '下载失败: ' . $e->getMessage()]); } } // 移动文件 public function moveFile($id) { try { $cate = Request::param('cate/d', 0); $result = Files::where('id', $id)->update(['cate' => $cate]); if ($result) { // 记录操作日志 $this->logSuccess('文件管理', '移动文件', ['id' => $id]); return json(['code' => 200, 'msg' => '移动成功']); } return json(['code' => 404, 'msg' => '文件不存在']); } catch (\Exception $e) { // 记录失败日志 $this->logFail('文件管理', '移动文件', $e->getMessage()); return json(['code' => 500, 'msg' => '移动失败: ' . $e->getMessage()]); } } }