将不包含扩展名的文件上传到wordpress?

Posted

技术标签:

【中文标题】将不包含扩展名的文件上传到wordpress?【英文标题】:Upload file which contain no extension into wordpress? 【发布时间】:2018-08-10 11:40:22 【问题描述】:

Wordpress 版本:4.7.9。

define('ALLOW_UNFILTERED_UPLOADS', true);

声明被写入wp-includes/functions.php。 编辑一个名为 test 的简单文件,该文件不包含任何扩展名。

vim test
to upload the file which contain no file extension.

上传文件test时报错。

This file type is not allowed. Please try another.

将文件test重命名为test.txt。 并将以下内容添加到wp-includes/functions.php

add_filter('upload_mimes','custom_upload_mimes');
function custom_upload_mimes ( $existing_mimes=array() ) 
     $existing_mimes['txt'] = 'application/txt';
     return $existing_mimes;
     

文件test.txt可以上传成功。 在配置文件中设置wp-config.php是没有用的。

define('ALLOW_UNFILTERED_UPLOADS', true);

我正在使用一个 24 岁的孩子。

这是我的/var/www/html//wp-content/themes/twentyfourteen-child/functions.php

<?php
define('ALLOW_UNFILTERED_UPLOADS', true);
function my_theme_enqueue_styles() 

$parent_style = 'twentyfourteen-style'; // This is 'twentyfourteen-style' for the Twenty Fourteen theme.


wp_enqueue_style( $parent_style, get_template_directory_uri() . '/style.css' );
wp_enqueue_style( 'child-style',
get_stylesheet_directory_uri() . '/style.css',
array( $parent_style ),
wp_get_theme()->get('Version')
);

add_action( 'wp_enqueue_scripts', 'my_theme_enqueue_styles' );
remove_filter('the_content', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');
remove_filter('comment_text', 'wptexturize');
?>

它没有任何作用。

【问题讨论】:

那么,你想使用wordpress上传/验证功能吗?还是您的目标只是上传文件? 问题是什么? 无法上传不包含扩展名的文件,如何上传不包含扩展名的文件? 你在哪里上传文件? Wordpress 没有输出类似“不允许此文件类型”的错误,我完全搜索了这个字符串,没有找到,您是通过媒体库上传的吗?也许这是您的服务器输出的错误消息?但我不能确定,但​​至少找不到那个字符串,这是肯定的(最新的 WP 版本)。 【参考方案1】:

真正的问题不在于 WordPress 的后端,而在于前端验证。上传器由Plupload 处理,默认情况下,WordPress 仅检查您是否在上传过程中定义了ALLOW_UNFILTERED_UPLOADS,而不会使用该值真正调整前端插件的过滤器验证。也许是一个小的前端故障。

如您所见,WordPress 始终呈现以下默认设置:

var _wpPluploadSettings = "defaults":"file_data_name":"async-upload","url":"\/wp-admin\/async-upload.php","filters":"max_file_size":"268435456b","mime_types":["extensions":"jpg,jpeg,jpe,gif,png,bmp,tiff,tif,ico,asf,asx,wmv,wmx,wm,avi,divx,flv,mov,qt,mpeg,mpg,mpe,mp4,m4v,ogv,webm,mkv,3gp,3gpp,3g2,3gp2,txt,asc,c,cc,h,srt,csv,tsv,ics,rtx,css,htm,html,vtt,dfxp,mp3,m4a,m4b,ra,ram,wav,ogg,oga,flac,mid,midi,wma,wax,mka,rtf,js,pdf,class,tar,zip,gz,gzip,rar,7z,psd,xcf,doc,pot,pps,ppt,wri,xla,xls,xlt,xlw,mdb,mpp,docx,docm,dotx,dotm,xlsx,xlsm,xlsb,xltx,xltm,xlam,pptx,pptm,ppsx,ppsm,potx,potm,ppam,sldx,sldm,onetoc,onetoc2,onetmp,onepkg,oxps,xps,odt,odp,ods,odg,odc,odb,odf,wp,wpd,key,numbers,pages"],"multipart_params":"action":"upload-attachment","_wpnonce":"9ee7fbf228","browser":"mobile":false,"supported":true,"limitExceeded":false;

在他们最终解决问题之前对问题的临时解决方法是挂钩 WordPress 正在调用的过滤器以生成前端设置plupload_default_settings

在您的functions.php 中添加过滤器:

add_filter('plupload_default_settings', function ($settings) 
    if (defined('ALLOW_UNFILTERED_UPLOADS') && ALLOW_UNFILTERED_UPLOADS) 
        unset($settings['filters']['mime_types']);
    

    return $settings;
);

这将允许您通过上传器上传您的test。由于WordPress已经在后台检查,只要你在wp-config.php中定义了ALLOW_UNFILTERED_UPLOADStrue,就应该可以正常上传了。

【讨论】:

很好的答案 +1,我冒昧地修复了您代码上的一个小故障,有一个额外的括号 @brasofilo 谢谢,我在输入时输入了所以没注意到哈哈:p【参考方案2】:

确保没有安全插件或其他插件覆盖您的define('ALLOW_UNFILTERED_UPLOADS', true); :)

我建议首先通过您的站点文件扫描ALLOW_UNFILTERED_UPLOADS,然后查看弹出的内容。

如果您还没有更新到最新版本的 WordPress,也请更新到最新版本,因为您收到的错误消息与我收到的不同。

【讨论】:

【参考方案3】:

您不想将其粘贴到 /functions.php 文件中,而是粘贴到 /wp-config.php 文件中。

或者,您可以通过将其粘贴到 /functions.php 文件中来为特定文件类型创建 MIME,就像您所做的那样。

【讨论】:

在配置文件wp-config.php中设置是没有用的。 对不起,我的意思是define(‘ALLOW_UNFILTERED_UPLOADS’, true);需要在wp-config.php的底部...出于兴趣,你怎么有一个不包含文件类型的文件? 文件不需要包含文件类型。放在wp-config.php的开头或底部是没有用的。请在你的wordpress中尝试.【参考方案4】:

Chin Leung 回答效果很好,唯一需要注意的是可以上传任何文件扩展名。

下面的方法需要将ALLOW_UNFILTERED_UPLOADS 设置为false(或者根本没有在wp-config 或functions.php 上设置)并且它允许没有扩展名的文件并且不允许阻止扩展名:

add_filter('upload_mimes', function ( $mimes ) 
    $mimes['*'] = 'text/plain';
    return $mimes;
);

add_filter( 'wp_check_filetype_and_ext', function ( $types, $file, $filename, $mimes) 
    # If filename doesn't containg a dot '.', allow upload
    if( false === strpos( $filename, '.' ) ) 
        $types['ext'] = '*';
        $types['type'] = 'text/plain';
    
    return $types;
, 10, 4 );

【讨论】:

【参考方案5】:

wp-config.php 文件的开头添加以下代码:

define('ALLOW_UNFILTERED_UPLOADS', true);

注意:要在媒体中上传新文件,请转到以下网址:

http://example.com/wp-admin/media-new.php

代替:

http://example.com/wp-admin/upload.php

因为在upload.php 中,mime 类型验证是由 javascript 完成的。

【讨论】:

以上是关于将不包含扩展名的文件上传到wordpress?的主要内容,如果未能解决你的问题,请参考以下文章

如何将完全自定义的 PHP/Web 文件上传到 WordPress?

使用 jQuery 上传文件插件时出错,将不需要的字符串附加到文件 (WebKitFormBoundary)

需要 php 编码特殊字符而不是 html 标签,以便包含在 wordpress 扩展 rss 文件中

试图将 .rmd 文件上传到 wordpress

将不同组中的 C++ 文件包含到 Objective-C++ 测试中

如何在 WP 中组织上传的媒体?