如何将Web应用上传的文件存储到另一台指定主机?
解决方案
$file->move() 是操作当前部署服务器本地文件系统的方法,仅支持传入本地磁盘绝对/相对路径,无法直接识别远程HTTP域名地址,因此你直接填写abc.host.net无法生效。
以下是可落地的实现方案:
方案1:两台站点部署在同一台服务器
直接使用目标站点abc.host.net的file目录在服务器上的绝对路径即可:
- 先获取
abc.host.net站点根目录对应的服务器绝对路径,举例为/www/wwwroot/abc.host.net - 修改上传代码为:
// 路径替换为你实际服务器上abc.host.net的file目录绝对路径 $file->move('/www/wwwroot/abc.host.net/file', $fileName);
- 注意:需要保证当前应用运行的进程账号对目标目录有读写权限
方案2:两台站点部署在不同服务器(SFTP/FTP方式)
在abc.host.net所在服务器开通SFTP/FTP服务后,在你的应用中配置远程磁盘实现上传:
- 打开Laravel项目的
config/filesystems.php,新增远程磁盘配置:
'disks' => [ // 保留原有其他磁盘配置 'remote_abc' => [ 'driver' => 'sftp', 'host' => 'abc.host.net', 'username' => '你的SFTP账号', 'password' => '你的SFTP密码', 'root' => '/www/wwwroot/abc.host.net/file', // 替换为远程服务器file目录绝对路径 'port' => 22, 'timeout' => 30, ], ]
- 修改上传逻辑,使用
Storage门面操作远程磁盘:
use Illuminate\Support\Facades\Storage; Storage::disk('remote_abc')->put($fileName, file_get_contents($file->getRealPath()));
方案3:两台站点部署在不同服务器(接口中转方式)
如果无法获取远程服务器的SFTP/FTP权限,可以在abc.host.net侧开发一个上传接收接口,当前应用上传文件时,将文件通过POST请求发送到该接口,由目标侧接口完成本地存储即可。
注意事项
- 上传完成后,文件访问地址直接使用
https://abc.host.net/file/拼接文件名即可 - 所有方案都需要做好上传文件的后缀、MIME类型、大小校验,避免恶意文件上传漏洞
内容的提问来源于stack exchange,提问作者pl-jay
相关产品推荐
相关产品推荐

