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

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

作者: Noah___________ | 来源:发表于2020-01-20 11:27 被阅读0次

    背景

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

    目标

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

    过程

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

    • 拼接出完整路径

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

    • 复制文件

    • 校验文件是否复制成功

    • 修改文件权限

    • 存储新的数据到数据库


    代码示例

    
    -- 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框架下,在Linux服务器上进行文件复制操作

          本文链接:https://www.haomeiwen.com/subject/rphjzctx.html