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
相关产品推荐
相关产品推荐

