如今互联网发展迅速,但WordPress后台支持上传的图片格式却没有及时更新,像早期的png,jpg等图片格式已经不能满足现如今的需求,很多例如ico、webp和svg等格式的图片都不能上传,这给我们造成了一些。

当4号网上传这些不受支持的例如.ico格式的图片时,给出了如下错误提示:抱歉,您无权上传此文件类型。(如下图)

4号网将“WordPress不支持上传.ico格式图片”这个问题在互联网上搜索了整整一天,都没有找到有效的答案,网上最多的办法就是:

WordPress增加上传ico、webp和svg格式文件权限的方法:

修改主题文件 functions.php 将以下代码复制到该文件的最后保存即可。

add_filter('upload_mimes', 'tbi_upload_mimes');
function tbi_upload_mimes($mimes = array()) {
    $mimes['svg'] = 'image/svg+xml';
    $mimes['ico'] = 'image/x-icon';
    $mimes['webp'] = 'image/webp';
    return $mimes;
}

但经4号网亲测,按照上述方法操作了还是无效,那怎么办?于是想到了最近大火的人工智能聊天机器人ChatGPT,于是带着希冀试一试吧!

没想到啊,百度了一整天都没解决的问题,它竟然真的给我解决了!!!

在整个对话的过程中,ChatGPT能记住并分析出前文内容,并陆续给出解决办法,4号网亲测不行后不断推翻。

ChatGPT就像一个不厌其烦的老师,兢兢业业,无怨无悔地深思熟虑地给出一个个答案。

不但如此,它居然还能教我这段代码跟刚才比有哪些不同,每段代码都是啥意思?

这个ChatGPT最新版给我解决了我百度一整天没有解决的问题,忍不住真心给它说了句谢谢。

而他一声不吭的就走了,连一句谢谢都没有收下,同志们,这是什么精神啊,这是白求恩精神,是大公无私的精神啊!

你不得不惊叹ChatGPT是多么划时代的伟大产物,这是新时代的开始,是新风帆的起航!

那么,对于“WordPress不支持上传.ico格式图片文件”的问题,看看人工智能ChatGPT是如何一步一步帮我解决的?

以下是4号网与ChatGPT陆陆续续的全部对话,一字不差,看4号网是如何一步一步将正确解决方法给“逼问”出来的?也让你们看看ChatGPT的“思维”深度。


4号网:

让WordPress媒体库支持上传.ico后缀的文件的办法

ChatGPT:

要让WordPress媒体库支持上传.ico后缀的文件,您可以尝试以下方法:

  1. 添加MIME类型

将以下代码添加到您的主题或子主题的functions.php文件中:

function add_ico_mime_types( $mimes ) {
    $mimes['ico'] = 'image/x-icon';
    return $mimes;
}
add_filter( 'upload_mimes', 'add_ico_mime_types' );

这将添加ICO文件的MIME类型,使得WordPress媒体库可以识别并上传它们。

  1. 禁用文件类型检查

有些情况下,即使您添加了MIME类型,WordPress也可能会拒绝上传ICO文件。这是因为WordPress会对上传的文件类型进行检查,以确保其安全。您可以通过添加以下代码到您的functions.php文件中来禁用文件类型检查:

function disable_upload_filetype_check( $checked, $file, $filename, $mimes ) {
    if ( ! $checked['type'] ) {
        $wp_filetype = wp_check_filetype( $filename, $mimes );
        $ext         = $wp_filetype['ext'];
        $type        = $wp_filetype['type'];
        $proper_filename = $filename;
        if ( $type && 0 === strpos( $type, 'image/' ) && $ext !== 'svg' && $ext !== 'ico' ) {
            $ext = $type = false;
        }
        $checked = compact( 'ext', 'type', 'proper_filename' );
    }
    return $checked;
}
add_filter( 'wp_check_filetype_and_ext', 'disable_upload_filetype_check', 10, 4 );

请注意,禁用文件类型检查可能会对网站安全性产生影响。因此,建议在上传ICO文件后重新启用检查。

4号网:

按照此方法,ico文件是可以上传的,但同时也解除了其他类型文件的上传限制。可否有一种方法只解除ico文件的安全检查,而继续限制上传其他类型的文件?

ChatGPT:

是的,您可以在不禁用所有文件类型检查的情况下,只解除ICO文件的安全检查。以下是一种方法:

function custom_upload_mimes($existing_mimes = array()) {
    $existing_mimes['ico'] = 'image/x-icon';
    return $existing_mimes;
}
add_filter('upload_mimes', 'custom_upload_mimes');

function custom_check_filetype_and_ext($data, $file, $filename, $mimes) {
    $wp_filetype = wp_check_filetype($filename, $mimes);

    if($wp_filetype['ext'] === 'ico' && $wp_filetype['type'] === 'image/x-icon') {
        $data['ext'] = 'ico';
        $data['type'] = 'image/x-icon';
    } else {
        $data = false;
    }

    return $data;
}
add_filter('wp_check_filetype_and_ext', 'custom_check_filetype_and_ext', 10, 4);

这段代码与之前的方法有些不同,它使用了两个过滤器:

  • upload_mimes:添加ICO文件类型到已有MIME类型列表中。
  • wp_check_filetype_and_ext:根据文件类型检查的结果,判断文件是否可以上传。

在第二个过滤器中,如果文件类型是ICO,就允许上传;否则,将返回 false,禁止上传。这样,其他类型的文件仍然受到文件类型检查的限制。

4号网:

上述操作将原本不需要安全检查的,例如png格式的文件也作了上传限制。可否能优化一下,使得除仅放开.ico格式的文件上传限制,而其他原本的允许上传的文件类型不做变更,原本限制的继续限制?

ChatGPT:

function custom_upload_mimes($existing_mimes = array()) {
    $existing_mimes['ico'] = 'image/x-icon';
    return $existing_mimes;
}
add_filter('upload_mimes', 'custom_upload_mimes');

function custom_check_filetype_and_ext($data, $file, $filename, $mimes) {
    $wp_filetype = wp_check_filetype($filename, $mimes);

    if($wp_filetype['ext'] === 'ico' && $wp_filetype['type'] === 'image/x-icon') {
        $data['ext'] = 'ico';
        $data['type'] = 'image/x-icon';
    } else {
        $allowed_types = array_keys(get_allowed_mime_types());
        $allowed = false;

        foreach($allowed_types as $type) {
            if($type === $wp_filetype['type']) {
                $allowed = true;
                break;
            }
        }

        if($allowed) {
            $data = $wp_filetype;
        } else {
            $data = false;
        }
    }

    return $data;
}
add_filter('wp_check_filetype_and_ext', 'custom_check_filetype_and_ext', 10, 4);

这段代码与之前的代码类似,但在第二个过滤器中,我们增加了额外的逻辑,以检查文件是否是允许上传的类型。

如果文件类型是ICO,就允许上传。否则,我们使用 get_allowed_mime_types() 函数获取当前WordPress允许的MIME类型列表,并检查文件类型是否在列表中。如果文件类型是允许的,就返回文件类型信息;否则,返回 false,禁止上传。这样,其他类型的文件仍然受到限制,而ICO文件可以上传。

4号网:

没有解决,依然不能上传原本可以上传的png、jpg等格式的文件

ChatGPT:

非常抱歉,我可能误解了您的问题。如果您只想允许ICO文件上传,而不影响其他类型文件的上传,可以尝试以下代码:

function custom_mime_types($mimes) {
    $mimes['ico'] = 'image/x-icon';
    return $mimes;
}
add_filter('upload_mimes', 'custom_mime_types');

function limit_mime_types($file, $filename, $mimes) {
    $wp_filetype = wp_check_filetype($filename, $mimes);
    $allowed_types = array('ico');

    if(in_array($wp_filetype['ext'], $allowed_types)) {
        $file['type'] = $wp_filetype['type'];
        $file['ext'] = $wp_filetype['ext'];
    } else {
        $file['error'] = __('Sorry, you can only upload ICO files.');
    }

    return $file;
}
add_filter('wp_handle_upload_prefilter', 'limit_mime_types', 10, 3);

这段代码中,我们通过 upload_mimes 过滤器将ICO文件类型添加到允许的文件类型列表中,然后使用 wp_handle_upload_prefilter 过滤器对上传的文件进行限制。在 limit_mime_types() 函数中,我们使用 wp_check_filetype() 函数获取文件的MIME类型,然后判断文件类型是否为ICO。如果文件类型为ICO,我们将文件类型和扩展名设置为相应的值,否则我们设置一个错误消息,阻止上传。这样,只有ICO文件可以上传,其他类型文件将被限制。

4号网:

你可能理解有误,或者我表达的不够清楚。现在,我们抛开刚才所有的问题和答案,我重新提问,你重新回答,好吗?

ChatGPT:

当然,非常抱歉之前我可能误解了您的问题。请问您有什么需要帮助的问题?我会尽力回答。

4号网:

请问让WordPress媒体库在原本的多种支持的文件类型的基础上,增加支持上传.ico后缀的文件的办法是什么?

ChatGPT:

要让WordPress媒体库支持上传.ico后缀的文件,您可以尝试以下方法:

  1. 在您的主题或子主题的 functions.php 文件中添加以下代码:
    function add_ico_mime_types($mimes) {
        $mimes['ico'] = 'image/vnd.microsoft.icon';
        return $mimes;
    }
    add_filter('upload_mimes', 'add_ico_mime_types');
    
    

    上述代码会将.ico文件类型添加到WordPress的MIME类型列表中。

  2. 添加以下代码到 functions.php 文件中:
    function allow_ico_upload($data, $file) {
        $filetype = wp_check_filetype( $file, $mimes );
        if($filetype['type'] == 'image/vnd.microsoft.icon') {
            $data['ext'] = 'ico';
            $data['type'] = 'image/vnd.microsoft.icon';
        }
        return $data;
    }
    add_filter('wp_handle_upload_prefilter', 'allow_ico_upload', 10, 2);
    

    上述代码会检查上传的文件类型,如果是.ico文件,就将文件类型设置为 image/vnd.microsoft.icon,扩展名设置为 .ico,并允许上传。

    以上两个步骤可以让WordPress媒体库支持上传.ico后缀的文件,同时也保留原有文件类型的上传限制。

4号网:

上述代码中的vnd.microsoft.icon是什么意思

ChatGPT:

vnd.microsoft.icon 是一种定义在MIME类型标准中的一种类型,用于表示ICO图标文件。MIME类型是一种在Internet上用于标识不同类型文件的标准。在这种情况下,我们需要将ICO文件的MIME类型设置为 image/vnd.microsoft.icon,以便WordPress能够识别这种文件类型并允许其上传到媒体库。

4号网:

image/vnd.microsoft.icon与image/x-icon在理解上有什么不同

ChatGPT:

image/vnd.microsoft.iconimage/x-icon 都是用于表示ICO图标文件类型的MIME类型,但是它们是两种不同的标准。

image/vnd.microsoft.icon 是一种由微软公司定义的MIME类型,用于表示ICO图标文件。它通常被用于Windows操作系统和Microsoft产品中。

image/x-icon 是一种较为通用的MIME类型,用于表示ICO图标文件,也可以用于其他类型的图标文件。它是在Internet Engineering Task Force(IETF)定义的MIME类型中进行规范的。

在WordPress中,两种MIME类型都可以用于表示ICO文件类型。不过,建议使用 image/vnd.microsoft.icon 来保持与Windows操作系统和Microsoft产品的兼容性。

4号网:

经测试,按照你刚才给的代码操作后,上传原本可以上传的图片文件均失败,提示“服务器无法处理图片。如果服务器繁忙或没有足够的资源来完成任务,就会发生这种情况。上传较小的图片可能会有所帮助。建议的最大尺寸为 2560 像素。”,请重新优化一下代码解决一下该问题

ChatGPT:

非常抱歉之前的代码没有解决您的问题。下面是一份更新过的代码,它可以让WordPress媒体库支持上传.ico后缀的文件,同时也保留原有文件类型的上传限制。

请将以下代码添加到您的主题或子主题的 functions.php 文件中:

function add_ico_mime_types($mimes) {
    $mimes['ico'] = 'image/vnd.microsoft.icon';
    return $mimes;
}
add_filter('upload_mimes', 'add_ico_mime_types');

function allow_ico_upload($data, $file) {
    $mimes = get_allowed_mime_types();
    $filetype = wp_check_filetype( $file, $mimes );
    if($filetype['type'] == 'image/vnd.microsoft.icon') {
        $data['ext'] = 'ico';
        $data['type'] = 'image/vnd.microsoft.icon';
    }
    return $data;
}
add_filter('wp_handle_upload_prefilter', 'allow_ico_upload', 10, 2);

这段代码与之前的代码唯一的区别是在 allow_ico_upload 函数中添加了 $mimes = get_allowed_mime_types(); 语句,以便获取允许上传的MIME类型列表。这样可以确保只有ICO文件的上传限制被解除,而不会影响其他文件类型的上传。

请注意,WordPress可能还会对上传的ICO文件大小设置限制。如果您的ICO文件大小超过WordPress的限制,请考虑使用第三方文件上传插件或者手动上传文件。

4号网:

依然提示“服务器无法处理图片。如果服务器繁忙或没有足够的资源来完成任务,就会发生这种情况。上传较小的图片可能会有所帮助。建议的最大尺寸为 2560 像素。”

ChatGPT:

非常抱歉,如果您按照之前提供的代码还是无法上传其他类型的文件,可能是因为 WordPress 对上传的文件大小设置了限制,或者其他原因。

您可以尝试增加以下代码来设置最大上传文件大小限制:

// 设置最大上传文件大小限制为20MB
@ini_set( 'upload_max_size' , '20M' );
@ini_set( 'post_max_size', '20M');
@ini_set( 'max_execution_time', '300' );

将这段代码添加到您的主题或子主题的 functions.php 文件中。这将设置上传文件大小限制为20MB,您可以根据需要进行修改。

如果以上方法仍然无法解决问题,可能是由于其他原因导致。建议您检查您的服务器设置,或者联系您的主机提供商获取支持。

4号网:

以上方法依然不行,要让WordPress媒体库支持上传ico、png、jpg、jpeg、bmp格式的文件,并解除类型为ico、png、jpg、jpeg、bmp文件的安全检查,其他类型的文件继续限制,需要怎么做?

ChatGPT:

非常抱歉之前的方案还未能满足您的需求。

如果您想让WordPress媒体库支持上传多种格式的文件,并且仅解除特定类型文件的安全检查,可以尝试以下方案。

首先,将以下代码添加到您的主题或子主题的 functions.php 文件中:

add_filter('upload_mimes', 'custom_upload_mimes');

function custom_upload_mimes ( $existing_mimes=array() ) {
    // 添加需要支持上传的文件类型
    $existing_mimes['ico'] = 'image/vnd.microsoft.icon';
    $existing_mimes['bmp'] = 'image/bmp';
    $existing_mimes['png'] = 'image/png';
    $existing_mimes['jpeg'] = 'image/jpeg';
    $existing_mimes['jpg'] = 'image/jpeg';

    // 移除其他类型文件的支持
    unset($existing_mimes['mp4']);
    unset($existing_mimes['doc']);
    unset($existing_mimes['pdf']);
    // ...
    
    return $existing_mimes;
}

在这段代码中,我们使用 add_filter() 函数来修改WordPress媒体库的允许上传的文件类型。我们添加了 icobmppngjpegjpg 格式的文件,并为每个文件类型指定了相应的MIME类型。

然后,我们使用 unset() 函数移除了其他不支持的文件类型,这些类型可以根据您的需求进行修改。

接下来,我们需要修改安全性检查,以便允许特定类型的文件上传。添加以下代码:

add_filter('wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) {
    $filetype = wp_check_filetype( $filename, $mimes );

    if(in_array($filetype['ext'], array('ico', 'bmp', 'png', 'jpeg', 'jpg'))) {
        $ext = $filetype['ext'];
        $type = $filetype['type'];
        $proper_filename = $data['proper_filename'];
        return compact('ext','type','proper_filename');
    }

    $data['errors'][] = __('Invalid file type.');

    return $data;
}, 10, 4);

这段代码会覆盖WordPress默认的文件类型检查功能,只允许上传 icobmppngjpegjpg 格式的文件,其他格式的文件将被拒绝上传。

请注意,在这个方案中,我们使用了一个匿名函数作为回调函数。如果您使用的是 PHP 版本小于 5.3,您需要将匿名函数替换为具名函数。

希望这个方案能够解决您的问题,如果还有其他问题或疑问,请随时与我联系。

4号网:

请忽视之前的问答,现在我重新提问。目前WordPress媒体库在上传ico格式的文件时,提示“抱歉,您无权上传此文件类型。”,我在WordPress主题或子主题的 functions.php 文件中添加了代码“function add_ico_mime_types( $mimes ) { $mimes['ico'] = 'image/x-icon'; return $mimes; } add_filter( 'upload_mimes', 'add_ico_mime_types' ); ”后,依然提示“抱歉,您无权上传此文件类型。”,经推测,这可能是因为WordPress会对上传的文件类型进行检查,以确保其安全。可能在这个时候,上传ico格式的文件被拦截了,那么,除了原本保持的安全检查的规则外,怎样把ico格式文件的安全检查也给排除掉呢?

ChatGPT:

除了在 functions.php 文件中添加上述代码以添加 ico 格式的 MIME 类型外,还需要在 wp-config.php 文件中添加一行代码,以禁用文件类型和文件大小的安全检查。具体操作如下:

  1. 打开 WordPress 安装目录下的 wp-config.php 文件。
  2. 在文件末尾添加以下代码:
    define('ALLOW_UNFILTERED_UPLOADS', true);
    
  3. 保存文件并上传到服务器。

这样,WordPress 就会禁用文件类型和文件大小的安全检查,可以上传任意类型和大小的文件,包括 ico 格式的文件。但请注意,这会降低网站的安全性,因此应该谨慎使用,并确保只有受信任的用户能够上传文件。

4号网:

请注意,我上述提问中,有一句“除了原本保持的安全检查的规则外,怎样把ico格式文件的安全检查也给排除掉呢”,在安全检查方面,新增一个单独对ico的排除,原本排除检查的文件类型继续排除,原本限制的文件类型继续限制,请重新回答

ChatGPT:

对于仅针对 ico 格式文件的安全检查,您可以使用以下代码将其添加到 functions.php 文件中:

function add_custom_mime_types( $mimes ) {
    // Add the .ico file extension to the list of allowed file types
    $mimes['ico'] = 'image/x-icon';
    
    // Remove the filter for checking non-image file types, such as .ico files
    remove_filter('upload_mimes', 'check_upload_mimes');
    
    // Add a new filter that only allows image file types and the .ico file type
    add_filter('upload_mimes', function($mimes) {
        $image_mimes = array(
            'jpg|jpeg|jpe' => 'image/jpeg',
            'gif' => 'image/gif',
            'png' => 'image/png',
            'bmp' => 'image/bmp',
            'tiff|tif' => 'image/tiff',
            'ico' => 'image/x-icon'
        );
        $mimes = array_merge($mimes, $image_mimes);
        return $mimes;
    });
    return $mimes;
}
add_filter('upload_mimes', 'add_custom_mime_types');

这将添加一个新的过滤器,仅允许上传图像文件和 ico 文件类型,同时移除原始的检查非图像文件类型的过滤器。这样就可以确保所有允许的文件类型都不会受到任何安全检查的限制,同时不允许上传其他文件类型。

4号网:

你好像没有理解对。是需要让WordPress媒体库上传文件时候,在安全检查方面,原本排除检查的文件类型继续排除,原本限制的文件类型继续限制,在此基础上,新增一个对ico类型文件的安全检查的排除。请重新回答

ChatGPT:

非常抱歉,我之前理解有误,感谢您的澄清。要让WordPress媒体库上传文件时,在安全检查方面,除了原本排除检查的文件类型继续排除、原本限制的文件类型继续限制之外,新增对ico文件类型的安全检查排除,可以使用如下代码:

function allow_custom_upload_mimes($existing_mimes) {
    // 添加ico类型
    $existing_mimes['ico'] = 'image/x-icon';
    
    // 获取已经存在的允许上传的文件类型
    $existing_upload_mimes = wp_get_mime_types();
    
    // 排除对ico的安全检查
    $existing_upload_mimes['ico'] = $existing_mimes['ico'];
    
    // 返回允许上传的文件类型
    return $existing_upload_mimes;
}
add_filter('upload_mimes', 'allow_custom_upload_mimes');

这段代码首先添加了ico类型的文件上传允许,然后获取已经存在的允许上传的文件类型并将ico类型添加到允许上传的文件类型中。最后,排除ico类型的安全检查并返回允许上传的文件类型。这样就可以让WordPress媒体库上传文件时,除了原本排除检查的文件类型继续排除、原本限制的文件类型继续限制之外,新增对ico文件类型的安全检查排除。

4号网:

这段代码需要添加到哪里

ChatGPT:

这段代码需要添加到你的 WordPress 主题或子主题的 functions.php 文件中。你可以通过 WordPress 后台进入外观编辑器,找到主题的 functions.php 文件进行编辑,也可以通过 FTP 连接到服务器,在 wp-content/themes/your-theme/functions.php 路径下找到该文件并进行编辑。

4号网:

按照上述代码操作后,上传.ico格式的文件,依然提示“抱歉,您无权上传此文件类型。”,请问问题出在哪里?

ChatGPT:

这个问题可能是因为WordPress仍然对上传的ico格式文件进行了安全检查。你可以尝试添加如下代码到你的 WordPress 主题或子主题的 functions.php 文件中:

// 允许上传ico文件
add_filter('wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) {
  if(empty($data['ext']) || empty($data['type']) || !$data['proper_filename']) {
    $wp_filetype = wp_check_filetype($filename, $mimes);
    if($wp_filetype['ext'] == 'ico') {
      $data['ext'] = 'ico';
      $data['type'] = 'image/vnd.microsoft.icon';
    }
  }
  return $data;
}, 10, 4);

这个代码段将重写 WordPress 对文件类型和文件扩展名的检查,以允许上传ico格式的文件,并且将文件类型设置为image/vnd.microsoft.icon

请注意,修改 WordPress 的核心代码可能会导致意想不到的问题,因此最好在本地环境中进行测试。如果遇到问题,最好恢复原始代码。


以上是4号网与ChatGPT陆陆续续的全部对话,“WordPress不支持上传.ico格式图片文件”的问题的最终的答案应该就是ChatGPT最后给出的回复。

该方法4号网亲测有效:

.ico格式的图片可以上传成功了,原来能上传成功的jpg/png等格式的图片依然能上传成功,原来不能上传成功的rar、exe格式依然不能上传成功。

最后,4号网认为,ChatGPT不仅是个聊天工具,更是个老师,是优秀的生产力工具,能大大解放双手,提高生产效率,是划时代的伟大产物!

鉴于ChatGPT如此优秀的生产力,4号网页搭建了一个基于OpenAI接口的版本号为GPT-3的人工智能聊天机器人——4号AI。

虽然比不上ChatGPT官方的GPT-3.5版本的强大分析能力,但好处是国内用户也可以使用,满足日常所需应该是够用的了。

4号AI,是一个超强的ChatGPT免费体验人工智能聊天机器人,它不仅能解答你各种各样的问题(不保证全对,实际上,它更善于一本正经的不懂装懂···但,只要你提问的足够精确,它回复的也足够精准),还会创作、写论文、答辩、编程、绘画等。4号AI回复内容越长所需时间也更长,请耐心等待~

大家有需要可以体验一下,免费的,网址是:https://ai.4.plus/

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。