391 lines
12 KiB
PHP
391 lines
12 KiB
PHP
<?php
|
|
|
|
namespace app\admin\controller;
|
|
|
|
use app\admin\BaseController;
|
|
use think\facade\Filesystem;
|
|
use think\facade\Request;
|
|
use think\facade\Db;
|
|
use think\Response;
|
|
|
|
use app\model\FilesCategory;
|
|
use app\model\Files;
|
|
|
|
class FileController extends BaseController
|
|
{
|
|
// 文件类型映射
|
|
protected $fileTypes = [
|
|
'image' => 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()]);
|
|
}
|
|
}
|
|
}
|