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 @ 2024-09-03 14:56  carol2014  阅读(51)  评论(0)    收藏  举报