如何在 HTML 页面上显示来自 FTP 服务器的图像? [复制]

Posted

技术标签:

【中文标题】如何在 HTML 页面上显示来自 FTP 服务器的图像? [复制]【英文标题】:How to display images from FTP server on HTML page? [duplicate] 【发布时间】:2016-01-20 07:55:08 【问题描述】:

我尝试构建一个图片库以显示来自 FTP 服务器的图片。 FTP 服务器需要密码验证。我扫描文件成功,但图像不显示在页面上,通过单击参考页面询问用户名和密码。

$content = '';
$ftp_server = "255.122.111.111";
$ftp_user = "user_name";
$ftp_pass = "password";

$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server"); 

if (@ftp_login($conn_id, $ftp_user, $ftp_pass)) 
    $content .= "<br />Connected as $ftp_user@$ftp_server\n";
 else 
    $content .= "<br />Couldn't connect as $ftp_user\n";


$files = ftp_nlist($conn_id, $dir);
foreach($files as $file_name)

    $content.=  '
         <div>
            <a href="ftp://'.$ftp_server.'/'.$file_name.'">
            <img src="ftp://'.$ftp_server.'/'.$file_name.'"     >
           </a>
         </div>';

我需要做什么才能使页面上显示图像?

【问题讨论】:

图像需要托管在用户可以访问的地方(例如 CDN),或者当您从 ftp 服务器检索它们时,您需要将它们存储在您的 Web 服务器中并通过链接到他们。您在此代码中尝试执行的操作(即直接从 ftp 服务器向最终用户提供图像)是不可能的(我知道) 正确。因为授权标头没有与页面请求一起发送。相反,您应该将文件复制到本地计算机,然后在必要时显示它们。如果不是很多,您可以将它们保存在 TMP 中进行会话,或者您可以将它们保存到磁盘。 【参考方案1】:

您可以根据要求准备一个脚本(例如 getimage.php)……

将图像文件从 FTP 服务器获取到(二进制)字符串变量中,就像在您的脚本中一样,然后 正确准备图像标题,如下面的 sn-p,(另见 this link from ***) 打印(二进制)图像字符串。

html 代码中插入常用的 标签。

遵循 getimage.php 脚本的 sn-p。图片类型是手动提取的:

// Get the image contents from FTP server into $binary
// $binary contains image text now
// Then ....

header('Content-type: ' . image_file_type_from_binary($binary));
echo $binary;

function image_file_type_from_binary($binary) 
  if (
    !preg_match(
        '/\A(?:(\xff\xd8\xff)|(GIF8[79]a)|(\x89PNG\x0d\x0a)|(BM)|(\x49\x49(?:\x2a\x00|\x00\x4a))|(FORM.4ILBM))/',
        $binary, $hits
    )
  ) 
    return 'application/octet-stream';
  
  $type = array (
    1 => 'image/jpeg',
    2 => 'image/gif',
    3 => 'image/png',
    4 => 'image/x-windows-bmp',
    5 => 'image/tiff',
    6 => 'image/x-ilbm',
  );
  return $type[count($hits) - 1];

【讨论】:

【参考方案2】:

在网络服务器上打开的 FTP 连接无论如何不能帮助网络浏览器对 FTP 服务器进行身份验证。


正确的解决方案是通过您的网络服务器路由图像,不仅隐藏凭据,还隐藏图像的原始来源。

创建一个脚本(PHP 或您使用的任何其他脚本)作为图像源(您将在&lt;img src=...&gt; 属性中使用它。该脚本将通过从 FTP 服务器下载图像来“生成”图像。

实现这样一个脚本(比如image.php)最简单的方法是:

<?

header('Content-Type: image/jpeg');

echo file_get_contents('ftp://username:password@ftp.example.com/path/image.jpg');

然后你在 HTML 中使用它:

<a src="image.php" />

(假设image.php 与您的 HTML 页面位于同一文件夹中)


脚本使用FTP URL wrappers。如果您的网络服务器不允许这样做,您必须更努力地使用 FTP 功能。看 PHP: How do I read a file from FTP server into a variable?


虽然对于真正正确的解决方案,您应该提供一些与文件相关的 HTTP 标头,例如 Content-LengthContent-TypeContent-Disposition。为此,请参阅Download file via PHP script from FTP server to browser with Content-Length header without storing the file on the web server。

【讨论】:

以上是关于如何在 HTML 页面上显示来自 FTP 服务器的图像? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 iFrame 的情况下在 html 上显示来自另一台服务器的 PHP 页面?

如何在 PHP codeigniter 中显示来自 FTP 服务器的图像? [复制]

如何在单独的 html 页面上显示来自提交表单的计算值? [复制]

在单独的 html 页面上显示来自数据库的数据

如何显示上传到我的 ftp 文件夹的图像

如何在 HTML 页面中显示来自单独 PHP 文件的结果?