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到的文件内容输出到标准输出,以流的方式返回给前端。

posted @   carol2014  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示