You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中如何用Filesystem的moveDirectory方法移动SFTP目录

Laravel SFTP 非空目录移动解决方案

问题根源

你直接实例化的Filesystem是本地文件系统实例,未关联SFTP驱动,无法识别远程路径;而Storage::disk('sftp')->move()仅支持单个文件或空目录移动,非空目录需用moveDirectory方法。

正确实现方式

无需手动拼接SFTP完整服务器路径,Laravel的SFTP磁盘已通过prefix配置处理根路径映射,直接使用磁盘对应的Filesystem实例调用moveDirectory即可:

// 获取SFTP磁盘对应的Filesystem实例
$sftpFilesystem = Storage::disk('sftp')->getDriver();

// 调用moveDirectory,参数为相对于prefix的路径
$from = 'tmp/'.$dir;
$to = $dir;
// 第三个参数为true表示覆盖已存在的目标目录
$moved = $sftpFilesystem->moveDirectory($from, $to, true);

修正后的控制器代码

function upload(Request $request){
    $dir = 'batch_'.$number;
    $tmp_input_path = 'tmp/'.$dir.'/input';
    $tmp_output_path = 'tmp/'.$dir.'/output';

    $path = $dir.'/input';
    $output_path = $dir.'/output';

    Storage::disk('sftp')->makeDirectory($tmp_input_path);
    Storage::disk('sftp')->makeDirectory($tmp_output_path);
    // 目标目录无需提前创建,moveDirectory会自动处理
    // Storage::disk('sftp')->makeDirectory($path);
    // Storage::disk('sftp')->makeDirectory($output_path);

    foreach (request()->file('files') as $key=>$image) {
       // 补充文件名,避免将文件内容直接写入目录导致报错
       $filename = $image->getClientOriginalName();
       Storage::disk('sftp')->put($tmp_input_path.'/'.$filename, file_get_contents($image));
     }
     
     $from = 'tmp/'.$dir;
     $to = $dir;
     // 使用SFTP磁盘的Filesystem实例执行非空目录移动
     $sftpFilesystem = Storage::disk('sftp')->getDriver();
     $moved = $sftpFilesystem->moveDirectory($from, $to, true);
}

额外注意点

  • moveDirectory第三个参数设为true会覆盖已存在的目标目录;设为false则目标存在时抛出异常,可根据业务需求调整。
  • 原代码中put方法缺少文件名,会导致文件内容被写入目录本身,需修正为带文件名的路径。
  • 无需手动创建目标目录,moveDirectory会自动生成必要的目录结构。

内容的提问来源于stack exchange,提问作者soniya kukreja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 14:00:34