thinkPHP框架下,在Linux服务器上进行文件复制操作

背景

由于之前系统设计的缺陷,导致用户在进行类似文件上传保存时,后台判定逻辑过于复杂,所以要进行这一类功能小范围的重构。

目标

保证原有功能的可用,以及优化服务端处理速度。

过程

  • 根据前端传过来的数据,从数据库查询到要复制的源文件路径(部分,需要拼接)

  • 拼接出完整路径

  • 确认目标目录是否存在,并进行相应操作

  • 复制文件

  • 校验文件是否复制成功

  • 修改文件权限

  • 存储新的数据到数据库


代码示例


-- 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+版本;

参考(必看):

  • https://www.runoob.com/php/func-filesystem-mkdir.html

  • https://www.runoob.com/php/func-filesystem-chmod.html

感谢:

  • thinkPHP社区的darkit,http://www.thinkphp.cn/code/3284.html,回答简洁明了,简直顿悟,也暴露出了自己相关知识的不足。

你可能感兴趣的:(thinkPHP框架下,在Linux服务器上进行文件复制操作)