您当前的位置:首页 > 计算机 > 服务器 > 万维网络 > 帝国cms

无法远程保存没有后缀图片的解决方法

时间:01-11来源:作者:点击数:
城东书院 www.cdsy.xyz

方案1:修改正则表达式(推荐)

修改帝国CMS中处理图片URL的正则表达式,使其能识别没有后缀的图片:

e/class/connect.php中找到远程保存函数,修改图片匹配规则:
// 原始正则(可能类似这样):
$pattern = '/src=["\']?([^"\'>]+?\.(?:jpg|jpeg|gif|png|bmp|webp))["\']?/i';

// 修改为:
$pattern = '/src=["\']?([^"\'>]+?(?:\.(?:jpg|jpeg|gif|png|bmp|webp)|(?:\?|&)(?:[^"\'>]+?\.(?:jpg|jpeg|gif|png|bmp|webp))))["\']?/i';

// 或者更通用的版本:
$pattern = '/src=["\']?([^"\'>]+?(?:(?:\?|&)[^"\'>]*?\.(?:jpg|jpeg|gif|png|bmp|webp)|\.(?:jpg|jpeg|gif|png|bmp|webp)))["\']?/i';

方案2:通过Content-Type获取文件类型

修改远程保存函数,使其能够通过HTTP响应头判断文件类型:

// 在获取远程文件的函数中添加以下逻辑:
function saveRemoteImage($url, $savePath) {
    // 获取HTTP头信息
    $headers = get_headers($url, 1);
    
    // 判断Content-Type
    if (isset($headers['Content-Type'])) {
        $contentType = strtolower($headers['Content-Type']);
        
        // 根据Content-Type设置扩展名
        $extensions = [
            'image/jpeg' => 'jpg',
            'image/jpg' => 'jpg',
            'image/png' => 'png',
            'image/gif' => 'gif',
            'image/webp' => 'webp',
            'image/bmp' => 'bmp',
        ];
        
        if (isset($extensions[$contentType])) {
            // 生成带扩展名的文件名
            $filename = md5($url . time()) . '.' . $extensions[$contentType];
            // 保存文件...
        }
    }
}

方案3:修改帝国CMS系统文件(具体位置)

找到并修改以下文件中的相关函数:

  1. e/class/connect.php - 查找GetFileGetRemoteFile函数
  2. e/class/functions.php - 查找远程保存相关函数
  3. e/admin/ecmseditor/infoeditor/GetRemoteFile.php - 专门处理远程文件获取的文件

在相关函数中添加对无后缀URL的处理:

// 在获取文件名的地方添加判断
$filename = basename($url);

// 如果文件名没有扩展名,尝试从Content-Type获取
if (!preg_match('/\.(jpg|jpeg|png|gif|bmp|webp)$/i', $filename)) {
    // 获取HTTP头
    $headers = @get_headers($url, 1);
    
    if (isset($headers['Content-Type'])) {
        $contentType = $headers['Content-Type'];
        $ext = '';
        
        if (strpos($contentType, 'jpeg') !== false || strpos($contentType, 'jpg') !== false) {
            $ext = 'jpg';
        } elseif (strpos($contentType, 'png') !== false) {
            $ext = 'png';
        } elseif (strpos($contentType, 'gif') !== false) {
            $ext = 'gif';
        } elseif (strpos($contentType, 'webp') !== false) {
            $ext = 'webp';
        }
        
        if ($ext) {
            $filename .= '.' . $ext;
        }
    }
}

方案4:使用自定义函数替代系统函数

如果不想修改核心文件,可以创建一个自定义函数:

// 创建自定义远程保存函数
function customSaveRemoteImage($url) {
    // 临时文件名
    $tempName = md5($url) . '.tmp';
    
    // 下载文件
    $content = file_get_contents($url);
    file_put_contents($tempName, $content);
    
    // 使用getimagesize判断图片类型
    $imageInfo = @getimagesize($tempName);
    
    if ($imageInfo) {
        $mime = $imageInfo['mime'];
        $ext = str_replace('image/', '', $mime);
        $ext = str_replace('jpeg', 'jpg', $ext);
        
        // 重命名文件
        $newName = md5($url) . '.' . $ext;
        rename($tempName, $newName);
        
        return $newName;
    }
    
    return false;
}

方案5:修改帝国CMS后台设置

如果是帝国CMS 7.5及以上版本,可以在后台设置:

  1. 进入后台 → 系统设置 → 参数设置 → 信息设置
  2. 找到“远程保存”相关选项
  3. 检查是否有相关配置项

方案6:使用插件或扩展

如果上述方法都不可行,可以考虑:

  1. 使用帝国CMS插件机制
  2. 使用第三方远程保存工具
  3. 使用API接口中转(将无后缀URL转换为有后缀URL)

预防措施

  1. 前端处理:在内容提交前,通过JavaScript检测并修正无后缀的图片URL
  2. 内容审查:发布文章前检查图片链接
  3. 使用CDN:将无后缀图片通过CDN转换为标准格式

注意事项

  1. 备份文件:修改核心文件前一定要备份
  2. 测试环境:先在测试环境验证修改效果
  3. 版本差异:不同版本的帝国CMS文件位置可能不同
  4. 性能考虑:通过HTTP头获取Content-Type会增加一次请求,可能影响性能

最简单有效的解决方案通常是方案1(修改正则表达式)和方案2(通过Content-Type判断),建议先尝试这些方法。

城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐