手册:配置文件上传

From MediaWiki.org
Jump to navigation Jump to search
This page is a translated version of the page Manual:Configuring file uploads and the translation is 99% complete.

Outdated translations are marked like this.
Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎français • ‎polski • ‎русский • ‎中文 • ‎日本語 • ‎한국어

MediaWiki 支持上传和整合媒体文件 本页描述此特性的技术方面,一般使用方面请看手册:图片管理 Help:Images

出于安全考虑,从 1.1版起 MediaWiki 中的上传功能默认是禁用的 。 通过配制可以启用上传功能,但建议你先检查确认一下先决条件。

先决条件

确保上传功能在 PHP 中启用

php.ini 中需有如下设置

file_uploads = On

如无此设置,PHP脚本中不能使用上传功能,并且MediaWiki的上传也不能启用。

如果启用了"open_basedir" 项,那么此项须包含: 1、你的 MediaWiki 中用于存储上传文件的文件夹(即"{$IP}/images") 2、'upload_tmp_dir' 项设置的文件夹(如果未设此项则需包含系统默认的上传临时文件的文件夹) 添加'upload_tmp_dir'可以避免像找不到文件/var/tmp/php31aWnF这样的消息(在这个例子中'upload_tmp_dir'是'/var/tmp')。 阅读文件上传基础知识,特别是move_uploaded_file()了解有关PHP文件上传的更多信息。

注意:变量的形式值是 boolean|布尔表达式。 PHP将每个未被识别为False值的字符串视为true,因此经常使用的“on”值会产生相同的结果。

Windows 与 IIS 用户检查

设置%SystemRoot%\TEMP拥有Internet来宾帐户的权限(IUSR_MachineName或对于IIS 7+:IUSR):读、写、执行

检查目录安全性

需要配置上传目录,以便最终用户无法上传和执行其他脚本,这些脚本可能会利用对您的Web目录的访问权并损坏您的Wiki或Web站点。

设置/images文件夹(或以前版本中的/uploads文件夹)以获得权限“755”:

  • 用户可以读、写和执行。
  • 可以读和执行。
  • 任何人都可读和执行。
只有文件夹必须具有可执行权限。文件不得具有可执行权限。

如果使用安全模式,请确保该目录由用于运行php脚本的用户(即apache用户或suphp脚本所有者)拥有。

sudo chown -R www-data:www-data images/

如果使用CentOS 6或Mageia,则chown命令中的所有者应为apache:apache而不是www-data:www-data。

如果使用SELinux,请确保相应地调整ACL(请参阅此处)。

如果使用suphp,请确保在/etc/suphp.conf中将umask设置为0022(或更低)。

  • 限制images文件夹上的目录列表

如果您不希望公共用户列出您的images文件夹,可以选择在apache配置中进行设置:

        <Directory /var/www/wiki/images>
                Options -Indexes
        </Directory>


检查 .htaccess 文件

MediaWiki安装文件夹中的images目录包含一个.htaccess文件,其中包含一些配置。 此文件的目标是使上载文件夹更安全,如果将上载目录放在其他位置,建议还将.htaccess文件复制到新位置,或直接在服务器上应用该配置。 但是,其中一些配置可能会导致冲突或错误,具体取决于服务器的配置方式。

需要考虑的一些事情:

  • 如果服务器不允许在.htaccess文件中设置或覆盖指令,则访问该文件夹下的任何文件可能会导致通用的“HTTP 500错误”。 如果是这种情况,您应该注释掉行,并将这些指令直接应用于服务器配置文件。 最有可能导致问题的指令是AddType,它阻止HTML和PHP文件作为HTML和php_admin_flag,这将阻止PHP文件在服务器上被解析和执行。
  • 在MediaWiki 1.27之前,如果您有一个自定义404处理程序来使用thumb.php 脚本生成缩略图,则此.htaccess文件中的重写规则可能会禁用以前的规则,因为它缺少RewriteOptions inherit选项(任务T67220)。

设置上传开启/关闭

MediaWiki版本: 1.5

在MediaWiki 1.5及更高版本中,要设置的属性位于LocalSettings.php中,$wgEnableUploads设置如下:

$wgEnableUploads = true; # 启用上传

这可以实现上传,正如人们所预料的那样。 要禁用它们,请将该属性设置为false:

$wgEnableUploads = false; # 禁用上传
MediaWiki版本: 1.4

在旧版本的软件中,要设置的属性位于LocalSettings.php中,但是是向后的,即$wgDisableUploads。 默认如下所示:

$wgDisableUploads = true; # 禁用上传

反转值以启用上传:

$wgDisableUploads = false; # 启用上传

使用一个中心存储库

InstantCommons是一项功能,通过配置更改启用,可让您立即访问维基共享资源中的数百万免费(免费许可)文件。

上传权限

默认来说,所有已注册用户都可以上传文件。 要限制它,你必须改变$wgGroupPermissions

  • 防止普通用户上传文件:$wgGroupPermissions['user']['upload'] = false;
  • 要创建一个名为“uploadaccess”的特殊组,并允许该组的成员上传文件:$wgGroupPermissions['uploadaccess']['upload'] = true;
  • 允许自动确认用户上传文件:$wgGroupPermissions['autoconfirmed']['upload'] = true;

替换现有文件的权利由额外的权限处理,称为reupload:

  • 防止普通用户覆盖现有文件:$wgGroupPermissions['user']['reupload'] = false;
  • 允许自动确认用户覆盖已存在的文件:$wgGroupPermissions['autoconfirmed']['reupload'] = true;

如果设置了ForeignFileRepo,则在本地替换这些文件的权限由特殊权限处理,称为reupload-shared

  • 防止普通用户在本地覆盖filerepo文件:$wgGroupPermissions['user']['reupload-shared'] = false;
  • 允许自动曲儿用户在本地替换filerepo文件:$wgGroupPermissions['autoconfirmed']['reupload-shared'] = true;

有关用户权限的详细信息,请参阅Manual:User rights,有关限制访问权限的详细信息,请参见Manual:Preventing access

设置文件种类

您可以在LocalSettings.php中添加$wgFileExtensions以允许上传其他所需的文件类型。 例如,您可以将$wgFileExtensions行更改为类似的内容

$wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'doc',
    'xls', 'mpp', 'pdf', 'ppt', 'tiff', 'bmp', 'docx', 'xlsx',
    'pptx', 'ps', 'odt', 'ods', 'odp', 'odg'
);

$wgFileExtensions = array_merge( $wgFileExtensions,
    array( 'doc', 'xls', 'mpp', 'pdf', 'ppt', 'xlsx', 'jpg', 
        'tiff', 'odt', 'odg', 'ods', 'odp'
    )
);

# 从DefaultSettings.php向现有列表添加新类型
$wgFileExtensions[] = 'docx';
$wgFileExtensions[] = 'xls';
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'mpp';
$wgFileExtensions[] = 'odt';
$wgFileExtensions[] = 'ods';

但是,某些文件扩展名被列入黑名单($wgFileBlacklist),即使添加到$wgFileExtensions也无法上传。 要上传带有黑名单扩展名的文件,您必须修改黑名单。 例如,允许用户上传可执行文件:

$wgFileExtensions[] = 'exe';
$wgFileBlacklist = array_diff( $wgFileBlacklist, array ('exe') );

另外,$wgMimeTypeBlacklist根据MIME类型防止某些文件类型,例如,基于MIME类型(MediaWiki版本1.14至1.17)禁止.zip文件。

你也可以设置$wgStrictFileExtensions

$wgStrictFileExtensions = false;

允许上传大多数类型的文件。但是,仍然不允许列入黑名单的文件类型和MIME类型。

警告 警告: 将$wgStrictFileExtensions设置为false或更改$wgFileBlacklist可能会导致您或您的用户面临安全风险。

如果您收到错误“文件已损坏或扩展名不正确”,请确保MIME类型检测正常工作。

如果您决定允许任何类型的文件,请确保您的mime检测正在运行,并考虑启用病毒扫描以进行上载。

要启用zip扩展名(在MediaWiki v1.19.23中测试),LocalSettings.php文件中需要以下内容:

$wgFileExtensions[] = 'zip';
// $wgTrustedMediaFormats[] = 'ARCHIVE';
$wgTrustedMediaFormats[] = 'application/zip';


登录

默认情况下,不允许匿名上传。 您必须先注册并登录,然后才能在工具箱中显示“上传文件”链接。

图片缩略图

有关图像自动显示/以缩略图显示的信息,请参见Image thumbnailing.

有关缩略图的问题,请参阅图像缩略图无法正常工作和/或出现

MediaWiki版本: 1.11

如果文件不是可视的(如图像或视频),则使用文件图标。 这些是由FileRepo组的File类中的iconThumb()函数生成的。 存储在"$wgStyleDirectory/common/images/icons/"中的图标,格式为"fileicon-$extension.png"。

为文件上传设定最大限制

php.ini中的post_max_size和upload_max_filesize

默认情况下,php.ini 中的配置代码将要上载的文件大小限制为2M(并将后期操作的最大大小限制为8M)。 要允许上传更大的文件,请在php.ini中编辑这些参数:

这可能需要服务器的root用户权限。 (如果您在共享主机上,请与服务器管理员联系。)

如果要将最大上载文件大小增加到大于100MB的值,则需要将$wgMaxUploadSize 与新的上载文件大小值一起添加到LocalSettings.php
找到php.ini文件
可以找到php.ini的典型位置。

php.ini文件的位置因您使用的发行版而异。 (尝试找到php.ini或php -i来查找配置文件的位置。) [1]

更改apache2文件夹中的php.ini文件很重要。 例如,/etc/php5/cli/php.ini上可能有一个核心默认php.ini,以及/etc/php5/apache2/php.ini。 如果您使用的是mod_php(最常见),那么正确的php.ini文件最可能的位置是/etc/php5/apache2/etc/php/7.0/apache2。 对于php-fastcgi,编辑/etc/php5/cgi/php.ini。

同一服务器上架设的多个网站

如果您在服务器上托管了多个网站,并且只想更改Mediawiki,请在<Virtual Host>中插入/etc/apache2/sites-enabled/your_wiki_site.com

php_value upload_max_filesize 100M
php_value post_max_size 100M

如果您的网站使用mod_php,则上述设置也适用于.htaccess文件。

如果您的站点使用PHP>=5.3并允许它,您可以在.user.ini文件中放置php.ini指令代替。

web服务器限制

您的Web服务器可能会对允许上载的文件大小施加进一步的限制。 对于Apache,其中一个相关设置是“LimitRequestBody”。 [2] For Nginx, client_max_body_size is the relevant setting.[3] For Lighttpd, server.max-request-size is what may need modification.[4]

编辑完php.ini或Web服务器配置后,需要重启Apache或IIS。

Ubuntu 16.04: sudo service apache2 restart

在更改PHP(或nginx服务器?)配置后,您可能还需要重新启动php5-fpm

(例如,sudo /etc/init.d/php5-fpm在Linux中重启。)

上传太大的文件警告

如果您尝试上传大于$wgUploadSizeWarning选项指定的文件,MediaWiki本身会发出警告。 这与PHP强加的硬限制无关。

临时上传限制

上传限制的临时更改(例如,在服务器场上使用多个wiki时)可以通过添加以下行来更改:

ini_set( 'post_max_size', '50M' );
ini_set( 'upload_max_filesize', '50M' );

到每个wiki的MediaWiki LocalSettings.php配置文件。 在这个例子中,PHP限制被设定为50MB。 请注意,这些设置不会覆盖上面设置的最大设置(因为核心php.ini和apache2 php.ini文件设置了绝对最大值)。 此方法设置小于绝对最大值的最大值。

IIS7 上传限制
默认情况下,IIS7[5]只允许通过Web应用程序上传30MB。 较大的文件将在上载后返回404错误。 如果遇到此问题,可以通过在web.config文件中将以下代码添加到<system.webServer>来增加最大文件大小来解决此问题:
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="50000000" />
  </requestFiltering>
</security>

使用上面的maxAllowedContentLength,用户可以上传大小为50000000字节(50MB)的文件。 此设置将立即生效,无需重新启动IIS服务。 web.config文件位于网站的根目录中。

允许最大到 2G 的文件上传:

将以下文本加入至LocalSettings.php:

$wgUploadSizeWarning = 2147483647;
$wgMaxUploadSize = 2147483647;

并且, 修改 这些行在PHP.INI中:

memory_limit = 2048M (this line may not be necessary)
post_max_size = 2048M
upload_max_filesize = 2048M

在IIS web.config文件中,覆盖maxRequestLength的值。 例如,web.config中的以下条目允许上载小于或等于2GB的文件:

<httpRuntime maxRequestLength="2097151" executionTimeout="18000"/>

使用IIS 7,您还需要将其配置为允许大型上载。 通过单击窗口中间的IIS部分中的“请求筛选>编辑功能设置”可以找到此问题。 将“允许的最大内容长度(字节)”字段设置为2147482624。 如果在IIS部分中未看到请求筛选,则需要通过控制面板中的打开或关闭Windows功能区域中的Internet信息服务万维网服务安全性启用它。

如果上述提示未启用大型上载,则打开命令提示符并执行此命令:

%windir%\system32\inetsrv\appcmd set config -section:requestFiltering -requestLimits.maxAllowedContentLength: 2147482624


允许 Java JAR 上传

默认情况下,MediaWiki将扫描所有看似ZIP存档的上传,并拒绝任何包含Java.class文件的上传。 这是一种防止用户上传恶意Java小程序的安全措施。 仅限非公共网站,请使用以下内容禁用此检查:

$wgAllowJavaUploads = true;

此设置可用作允许不加区别地接受mimetypes的解决方法。 例如,如果您尝试上载Word 2007创建的.doc文件,无论您提供的ext列表和您调用或禁止的mimetype检查,您都会收到以下消息:

该文件是损坏的或其他不可读的ZIP文件,无法正确检查安全性。

由Word 2007(以及可能的更高版本)保存的.doc文件包含一个小的嵌入式ZIP存档,存储的元数据不能以早期版本的Word使用的二进制.doc格式表示。 此嵌入的ZIP数据会混淆Java归档扫描程序,导致.doc文件被拒绝。 较新的.docx文件格式的文件是完整的有效ZIP存档,可以成功上载而无需设置$wgAllowJavaUploads

直接从 URL 上传 ("Sideloading")

如果要允许用户直接从URL上载文件,而不是从本地计算机上的文件上载,请设置$wgAllowCopyUploads=true

默认情况下,只能使用API(或上传向导等扩展)按URL上传。 要使选项在Special:Upload中可用,您需要将$wgCopyUploadsFromSpecialUpload设置为true。 在上传表单中,您将看到URL的附加字段,位于通常的文件名字段下方。 默认情况下,URL字段显示为灰色,但可以通过激活字段左侧的单选按钮(复选框)来激活。

要使用此功能,用户必须拥有用户权限upload_by_url。 默认情况下,此权限被授予管理员,直到MediaWiki 1.20,但现在需要明确授予它。 要对于普通用户允许这个,设置

 $wgGroupPermissions['user']['upload_by_url'] = true;

请注意,允许直接从网络上的任意位置上传,可以更轻松地上传随机的,不需要的内容,并且可能会被误解为上传人们可能在网络上遇到的任何内容的邀请。

必须启用PHP的cURL支持才能支持此功能。 使用 - with-curl选项安装时配置PHP。
如果您的服务器通过代理访问Internet,则需要相应地设置$wgHTTPProxy。 您可以直接提供它,或者,如果您的服务器提供环境变量“http_proxy”,请参阅您的phpinfo(),然后您可以在LocalSettings.php中使用以下代码:
/*
 * Proxy to use for CURL requests.
 */
if ( isset( $_ENV['http_proxy'] )) $wgHTTPProxy = $_ENV['http_proxy'];

恢复删除图像

自MediaWiki 1.8以来,可以选择取消删除图像作为选项,默认情况下启用MediaWiki 1.11。

在MediaWiki 1.11之前,您可以通过设置$wgSaveDeletedFiles=true来启用图像的取消删除。 从版本1.11开始,行为由$wgFileStore控制,删除的文件默认存储在$wgUploadDirectory/deleted中。 从版本1.17开始,$wgFileStore已被弃用,而应使用$wgDeletedDirectory

大规模上传

有许多工具可以一次上传多个文件,而不是分别上传每个文件:

Extension Description Release status Requirements
Extension:UploadWizard Used on Wikimedia Commons Stable MediaWiki 1.23+
Extension:MsUpload Allows a user to upload multiple files including by dragging & dropping files. Stable 1.17, 1.18, 1.19, 1.20, 1.21, 1.22
Extension:SimpleBatchUpload Basic, no-frills uploading of multiple files to MediaWiki Stable 1.26+
Extension:UploadLocal Beta
扩展:批量上传 Not currently maintained Broken 1.19+
Commonist (external link to Wiki Commons) Requires file upload via api.php.
importImages.php "Place the files on the server in a readable location and execute the maintenance/importImages.php script from the command line."[6]
User:Nichalp/Upload script
Commons:File upload service/Script Deprecated
User:File Upload Bot (Kernigh)

上传目录

每当上传图像时,都会创建几件事:

  1. 文件命名空间中的文章,其中包含文件名,例如文件:MyPicture.png。 此页面已存储,可以像任何其他页面一样进行编辑。
  2. 文件本身存储在文件系统的文件夹中,该文件系统在$wgUploadDirectory中配置,或者在其子文件夹中配置为一个(见下文)。
  3. 如有必要,可以使用缩略图,必要时将创建该文件的缩略图版本(例如,在文件描述页面上使用)。 它们存储在图像目录的缩略图目录中,位于每个主文件的单独目录中。

如果启用$wgHashedUploadDirectory(默认情况下),MediaWiki会在images目录中创建多个子目录。

如果$wgHashedUploadDirectory设置为true,则上传的文件将根据文件名的md5哈希的前两个字符分发到$wgUploadDirectory的子目录中(例如$IP/images/a/ab/foo.jpg)。 创建这样的子目录是自动处理的。 这用于避免在一个文件夹中包含太多文件,因为某些文件系统在一个文件夹中对大量文件执行效果不佳。

如果您只维护一个包含很少上传图像的小维基,可以通过设置$wgHashedUploadDirectory=false来关闭它,所有图像都会上传到$wgUploadDirectory本身(例如$IP/images/foo.jpg)。

多维基站点

  • 确保您已更改LocalSettings.php中的网站位置,例如/var/lib/mediawiki到你的安装所在的位置,并创建一个可写图像目录(其余大部分都可以进行符号链接)。

不这样做会神秘地破坏图片上传。

配置上传表单

随默认的MediWiki安装提供的上传表单消息(当您单击“上载文件”链接或转到Special:Upload链接时出现)可能不太适合您。

在这种情况下,您可以编辑MediaWiki:Uploadtext内容并提供自己的文本。 如果您的维基站点是多语言,请不要忘记编辑MediaWiki:Uploadtext/de等本地化版本。

MediaWiki:Licenses页面上,您可以自定义上传站点许可证的下拉列表。

考虑到默认情况下MediaWiki:Licenses/de等本地化版本不起作用。 要启用它们,您必须配置$wgForceUIMsgAsContentMsg变量。

编辑MediaWiki:Upload-default-description以将初始文本添加到上载表单的摘要字段中(例如,您的Wiki站点具有用于上载摘要的通用模板,并且您希望每个人都使用该模板)。

参见: Upload form changes

Windows 上的已知问题

由于PHP错误,在Windows服务器上运行MediaWiki在允许的文件名中有一些限制。 PHP无法正确处理包含非ascii字符的文件名,MediaWiki将拒绝上传包含此类字符的文件,以防止上传内容(任务T3780),消息为本wiki不支持在文件名中使用特殊字符。

因为MediaWiki 1.31及更高版本可以处理带有非ascii字符的文件名,如果它使用的是PHP 7.1或更高版本。

具有非字母数字字符的数据库名称的已知问题

如果$wgDBname包含非字母数字字符,则上传可能会失败,并出现错误,例如无法创建目录"mwstore://local-backend/local-public/<path>".。 这是由内部检查文件后端的有效容器名称引起的,但它是使用$wgDBname构造的。

从MediaWiki 1.26开始,当$wgDBname包含点时,它允许上传。

参见

参考资料

  1. 有关php.ini文件所在位置的示例,请参阅php.ini位于哪里?
  2. core - Apache HTTP Server Version 2.4 - LimitRequestBody Directive, Apache manual
  3. client_max_body_size, Nginx manual
  4. server.max-request-size, Lighthttpd manual
  5. IIS7是Internet信息服务的新版本(版本7.0),它是Windows Vista和下一个Windows Server版本的一部分。Windows 2008上的
  6. http://xpt.sourceforge.net/techdocs/language/wiki/wikimedia/wkm07-MediaWikiImport/index.html#mass_image_upload_zip_