You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP显示托管服务器public_ftp文件夹中的图片?

如何显示FTP服务器public_ftp目录中的图片

现有尝试的问题分析

  • 第一种方法中,ftp_nlist返回的是FTP服务器内部的文件路径(如myfolder/image.jpg),但浏览器无法直接识别该路径——因为public_ftp不在Web服务器的根目录(public_html)下,无法通过HTTP请求直接访问。
  • 第二种方法的ftp://URL存在两个核心问题:一是现代浏览器大多默认禁止在<img>标签中使用带明文账号密码的FTP链接,存在严重安全风险;二是多数托管环境不会开放FTP目录的直接Web访问权限,浏览器无法加载这类资源。

可行解决方案

方法1:用PHP作为代理读取并输出图片

通过PHP脚本连接FTP服务器,读取图片文件内容后,设置正确的HTTP响应头,将图片内容直接输出给浏览器。浏览器通过访问PHP脚本间接获取FTP上的图片,这是最通用的方案。

示例代码:

<?php
// FTP连接信息
$ftp_server = "ftp.mydomain";
$ftp_user = "username";
$ftp_pass = "password";

// 过滤并获取请求的图片文件名(防止目录遍历攻击)
$img_name = basename($_GET['img']);
$remote_path = "myfolder/" . $img_name;

// 建立FTP连接
$conn_id = ftp_connect($ftp_server);
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);

if (!$conn_id || !$login_result) {
    http_response_code(500);
    die("FTP连接失败");
}

// 启用被动模式(多数托管环境需要)
ftp_pasv($conn_id, true);

// 读取图片内容
ob_start();
if (!ftp_get($conn_id, "php://output", $remote_path, FTP_BINARY)) {
    http_response_code(404);
    die("图片不存在");
}
$image_content = ob_get_contents();
ob_end_clean();

// 根据图片后缀设置Content-Type
$ext = strtolower(pathinfo($remote_path, PATHINFO_EXTENSION));
$content_type = match($ext) {
    'jpg', 'jpeg' => 'image/jpeg',
    'png' => 'image/png',
    'gif' => 'image/gif',
    default => 'application/octet-stream',
};

// 输出HTTP头和图片内容
header("Content-Type: $content_type");
header("Content-Length: " . strlen($image_content));
echo $image_content;

// 关闭FTP连接
ftp_close($conn_id);
?>

使用方式:在页面中通过PHP代理脚本访问图片

<img src="ftp_image_proxy.php?img=mypicture.png" alt="FTP存储的图片">

方法2:配置Web服务器映射public_ftp目录

如果有权限配置Web服务器(如Apache或Nginx),可以将public_ftp/myfolder映射为一个可通过HTTP访问的路径,直接用普通URL访问图片。

Apache配置示例(可在.htaccess或服务器配置文件中添加)

Alias /ftp-images /实际路径/public_ftp/myfolder
<Directory /实际路径/public_ftp/myfolder>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    # 仅允许访问图片文件,禁止其他资源访问
    <FilesMatch "\.(jpg|jpeg|png|gif)$">
        Require all granted
    </FilesMatch>
    <FilesMatch "^.*$">
        Require all denied
    </FilesMatch>
</Directory>

配置后访问方式:

<img src="/ftp-images/mypicture.png" alt="图片">

Nginx配置示例(在server块中添加)

location /ftp-images {
    alias /实际路径/public_ftp/myfolder;
    # 仅允许访问图片文件
    if ($request_filename !~* \.(jpg|jpeg|png|gif)$) {
        return 403;
    }
}

方法3:同步FTP目录到Web根目录

如果图片不需要实时更新,可以定期将public_ftp/myfolder中的图片同步到public_html下的目录(如/images/ftp),直接用普通HTTP URL访问。

Linux cron自动同步示例(需Shell权限)

# 每天凌晨1点执行同步
0 1 * * * lftp -c 'open ftp://username:password@ftp.mydomain; mirror -R public_ftp/myfolder public_html/images/ftp'

PHP脚本同步示例(无Shell权限时使用)

<?php
$ftp_server = "ftp.mydomain";
$ftp_user = "username";
$ftp_pass = "password";
$remote_dir = "myfolder";
$local_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/ftp";

// 创建本地存储目录
if (!is_dir($local_dir)) {
    mkdir($local_dir, 0755, true);
}

// 连接FTP
$conn_id = ftp_connect($ftp_server);
ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);

// 获取远程文件列表并同步图片
$files = ftp_nlist($conn_id, $remote_dir);
foreach ($files as $remote_file) {
    $filename = basename($remote_file);
    if (preg_match('/\.(jpg|jpeg|png|gif)$/i', $filename)) {
        ftp_get($conn_id, $local_dir . "/" . $filename, $remote_file, FTP_BINARY);
    }
}

ftp_close($conn_id);
echo "图片同步完成";
?>

内容的提问来源于stack exchange,提问作者TIgrine nacer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:05:21