有一个需求是访问存储在群辉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到的文件内容输出到标准输出,以流的方式返回给前端。