背景
由于之前系统设计的缺陷,导致用户在进行类似文件上传保存时,后台判定逻辑过于复杂,所以要进行这一类功能小范围的重构。
目标
保证原有功能的可用,以及优化服务端处理速度。
过程
-
根据前端传过来的数据,从数据库查询到要复制的源文件路径(部分,需要拼接)
-
拼接出完整路径
-
确认目标目录是否存在,并进行相应操作
-
复制文件
-
校验文件是否复制成功
-
修改文件权限
-
存储新的数据到数据库
代码示例
-- snip --
// 导入DB类
use think\Db;
-- snip --
// 定义用户名(理论上应该是根据请求的用户,来查询用户名)
$username = "noah";
// 获取请求复制的文件ID
$id = input('post.id');
// 从数据库查询源文件位置
$fileInfo = Db::query("SELECT name, type, path FROM file_table WHERE id = $id");
// 定义源文件位置
$sourceFilePath = ROOT_PATH . $fileInfo[0]["path"];
// 定义存储部分路径字段
$savePath = "/upload/user/" . $username . "/file/";
// 定义目标目录
$targetFolderPath = ROOT_PATH . $savePath;
// 定义目标文件名称
$targetFileName = $fileInfo[0]["name"] . "_copy.";
// 定义目标文件
$targetFilePath = $targetFolderPath . $targetFileName . $fileInfo[0]["type"];
// 判断目标目录否存在
if (!file_exists($targetFolderPath)) {
echo "开始新建目标目录...\n";
// 新建目标目录
if (mkdir($targetFolderPath, 0755, true)) {
echo "目标文件夹新建成功!\n";
// 复制文件主体到用户目录下
if (copy($sourceFilePath, $targetFilePath)) {
echo "源文件复制成功!\n";
// 改变目标文件权限
if (chmod($targetFilePath, 0755)) {
echo "目标文件权限更新成功!\n";
}
} else {
echo "源文件复制失败!\n";
}
} else {
echo "目标文件夹新建失败!\n";
}
} else {
echo "目标目录存在!\n";
// 复制文件主体到用户目录下
if (copy($sourceFilePath, $targetFilePath)) {
echo "复制源文件成功!\n";
// 改变目标文件权限
if (chmod($targetFilePath, 0755)) {
echo "目标文件权限更新成功!\n";
}
} else {
echo "源文件复制失败!\n";
}
}
// 将复制结果插入到数据库中
Db::execute("INSERT INTO file_table(name, type, path) VALUES('" . $targetFileName . "', '" . $fileInfo[0]["type"] . "', '" . $savePath . "')");
*注:
-
文章并没有使用thinkPHP的ORM,原因是一方面是用的比较少,另一方面是感觉用起来很奇怪;
-
ROOT_PATH 为thinkPHP的完整目录根路径;
-
必须是PHP5+版本;
参考(必看):
感谢:
- thinkPHP社区的darkit,http://www.thinkphp.cn/code/3284.html,回答简洁明了,简直顿悟,也暴露出了自己相关知识的不足。
网友评论