
Laravel 的 Storage 门面默认将文件保存在配置中指定磁盘的 root 目录下,而非项目本地路径;使用 copy() 时仅在同一磁盘内部操作,不会跨服务器或本地文件系统写入。
laravel 的 storage 门面默认将文件保存在配置中指定磁盘的 `root` 目录下,而非项目本地路径;使用 `copy()` 时仅在**同一磁盘内部**操作,不会跨服务器或本地文件系统写入。
在 Laravel 中,Storage::disk('custom-ftp')->copy($source, $destination) 并不会将文件保存到你的 Laravel 项目目录(如 public/ 或 storage/app/),而是严格遵循所选磁盘驱动的配置路径——尤其是 filesystems.php 中该磁盘的 'root' 值。
例如,若你的 config/filesystems.php 中定义了如下 FTP 磁盘:
'custom-ftp' => [
'driver' => 'ftp',
'host' => 'ftp.example.com',
'username' => 'user',
'password' => 'pass',
'root' => '/var/www/uploads', // ← 关键:所有操作均以此为基准路径
'passive' => true,
],那么执行:
$dirDest = 'temp-docs/temp.pdf'; // 注意:推荐使用正斜杠 /,Windows 下 \ 可能引发路径解析问题
Storage::disk('custom-ftp')->copy($this->document_path, $dirDest);实际保存路径为:ftp://ftp.example.com/var/www/uploads/temp-docs/temp.pdf
(即 root + $dirDest)
⚠️ 重要提醒:
-
copy()仅支持同磁盘内复制,无法将 FTP 上的文件“下载”到本地磁盘,或从本地复制到 FTP; - 若
$dirDest已存在,copy()会静默失败或抛出FileAlreadyExistsException(取决于驱动实现),因此务必提前校验:
if (!Storage::disk('custom-ftp')->exists($dirDest)) {
Storage::disk('custom-ftp')->copy($this->document_path, $dirDest);
} else {
\Log::warning("File already exists: {$dirDest}");
}✅ 正确实现跨磁盘/跨服务器复制(如 FTP → 本地 or FTP → 另一 FTP):
应组合使用 get()(读取原始内容) + put()(写入目标磁盘):
// 示例:从 custom-ftp 复制到本地 public_disk(如 public/ 目录)
if (Storage::disk('custom-ftp')->exists($this->document_path)) {
$content = Storage::disk('custom-ftp')->get($this->document_path);
Storage::disk('public')->put('temp-docs/temp.pdf', $content); // 实际路径:public_path('temp-docs/temp.pdf')
}
// 示例:从一个 FTP 磁盘复制到另一个 FTP 磁盘
$content = Storage::disk('my_ftp')->get($this->document_path);
Storage::disk('backup_ftp')->put('backups/' . basename($this->document_path), $content);? 额外建议:
- 统一使用正斜杠
/表示路径(Laravel 内部自动兼容 Windows); - 在生产环境避免硬编码路径,可借助
Storage::path()(仅对local磁盘有效)或自定义辅助方法获取绝对路径; - 对大文件操作,考虑流式处理(
readStream()/writeStream())以节省内存; - 始终启用异常捕获与日志记录,便于排查连接超时、权限拒绝等 FTP 常见问题。
掌握磁盘配置与路径语义,是安全、可靠使用 Laravel Storage 的核心前提。


















