php获取FTP服务器中文件内容返回给前端
有一个需求是访问存储在群辉Synology NAS上的图片,https://ip:port/path/to/image.jpg,用浏览器打开会出现“您的连接不是私密/安全连接”错误。
网上检索资料发现可能是因为缺少SSL证书的关系。
引用 https://www.cloudflare-cn.com/learning/ssl/connection-not-private-explained/ 中的内容介绍:
此错误是由网站的 SSL 证书(丢失、过期或并非由合法证书颁发机构颁发)导致,或者是客户端由于其他原因无法访问它。对于通过安全的 HTTPS 连接提供网站服务而言,SSL 证书是必需的。没有 SSL 证书的网站无法证明其身份,无法加密通信。
不知什么缘故,NAS没有配置或者没有办法使用http访问。最终确定了使用FTP访问的方式。
按照之前使用FTP的方式,将文件从远程图片server下载下来存储在后端server,然后将文件地址返回给前端访问。然而,图片下载到后端server几乎不会复用,还会浪费server空间,就要看下有没有办法把文件内容直接返回给前端。然后就找到了这种写法,记录下:
test.html
<img src="http://localhost:3000/test.php" onerror="this.src='images/nopicture.jpg'" />
test.php
<?php
$remote_file = "/path/to/img.jpg";
$ftp_config = [
'ip' => '',
'port' => '',
'username' => '',
'password' => '',
'timeout' => 10
];
$ftp = ftp_connect($ftp_config['ip'], $ftp_config['port'], $ftp_config['timeout']);
if ($ftp) {
$login_result = ftp_login($ftp, $ftp_config['username'], $ftp_config['password']);
if ($login_result) {
ftp_pasv($ftp, true);
$size = ftp_size($ftp, $remote_file);
if ($size > 0) {
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=" . basename($remote_file));
header("Content-Length: $size");
ftp_get($ftp, 'php://output', $remote_file, FTP_BINARY);
ftp_close($ftp);
}
}
}
将ftp_get到的文件内容输出到标准输出,以流的方式返回给前端。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix