手册:配置文件上传

From mediawiki.org
This page is a translated version of the page Manual:Configuring file uploads and the translation is 97% complete.
Outdated translations are marked like this.

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

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

先决条件

确保上传功能在PHP中启用

php.ini 中需有如下设置:

file_uploads = On

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

如果設定了"open_basedir"项,那么此项须包含你的MediaWiki安裝中的上传文件夹("{$IP}/images")和'upload_tmp_dir'文件夹(如果未设定則使用系统默认文件夹)。 添加'upload_tmp_dir'可以避免像找不到文件/var/tmp/php31aWnF这样的消息(在这个例子中'upload_tmp_dir'是'/var/tmp')。 阅读File 文件上传基础知识,特别是move_uploaded_file()以了解有关PHP文件上传的更多信息。

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


Windows 与 IIS 用户检查

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

检查目录安全性

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

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

  • 用户可以读、写和执行。
  • 可以读和执行。
  • 任何人都可读和执行。
只有文件夹必须具有可执行权限。文件不得具有可执行权限。 在Linux中,要從資料夾內所有檔案移除執行權限,並向所有資料夾和子資料夾添加執行權限: chmod -x+X uploads_folder -R

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

检查服务器安全状况

See Manual:Security#Upload security for changes to make to your webserver configuration to prevent uploaded files from executing code or having browsers execute malicious files.

  • 限制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.5

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

$wgEnableUploads = true; # 启用上传

要禁用上传功能,请将该属性设置为false(!注意LocalSettings.php中存在这一行):

$wgEnableUploads = 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;

有关用户权限的详细信息,请参阅手册:用户权限,有关限制访问权限的详细信息,请参见手册:阻止访问

设置文件种类

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

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

$wgFileExtensions = array_merge( $wgFileExtensions, [
	'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';

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

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

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

你也可以设置$wgStrictFileExtensions

$wgStrictFileExtensions = false;

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

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

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

如果您决定允许任何类型的文件,请确保您的mime检测正在运行,并考虑启用enabling virus scans for uploads

要启用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"。

为文件上传设定最大限制

浏览器在实际发送文件之前会告知服务器需要上传的文件的大小。

如果上传的文件太大,它将被目标(服务器)拒绝,上传将会失败。根据不同的限制会抛出不同的错误:

  • 如果超过了服务器传输数据的最大值的限制(nginx,Apache),可能会仅仅抛出HTTP 500错误或HTTP 413 Payload Too Large(请求的实体太大)。
  • 如果这一限制是在PHP层面:如果超出了post_max_size,可能会返回HTTP 500错误(或是一个空白页面)。否则,MediaWiki会给出一个有意义的错误信息。
php.ini中的post_max_size和upload_max_filesize

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

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

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

php.ini文件的位置因您使用的发行版而异。 在 手册:Php.ini 查看找到你的服务器的 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”。 [1]对于nginx,client_max_body_size是相关的设置。[2]对于Lighttpd,server.max-request-size需要修改。[3]

编辑完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[4]只允许通过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 上传

The details described in this section may no longer work. $wgAllowJavaUploads variable has been removed in MW 1.39.0.

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

$wgAllowJavaUploads = true;

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

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

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

直接从 URL 上传 ("Sideloading")

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

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

要使用此功能,用户必须拥有user rightupload_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'];

大规模上传

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

扩展 描述 发布状态 必要条件
扩充功能:上传精灵 Used on Wikimedia Commons 稳定版 MediaWiki 1.23+
Extension:MsUpload 允许用户上传多个文件,包括拖放文件。 稳定 1.32+
扩展:简单批量上传 将多个文件基本、简单地上传到MediaWiki 稳定 1.31+
Extension:PageProperties#File_upload Includes a fully-configurable multiple file upload with filename formula and CRUD operations Stable 1.35+
Commonist (external link to Wikimedia Commons) Requires file upload via api.php.
  • with python:
importImages.php "Place the files on the server in a readable location and execute the maintenance/importImages.php script from the command line."[5]

上传目录

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

  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站点具有用于上载摘要的通用模板,并且您希望每个人都使用该模板)。

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. core - Apache HTTP Server Version 2.4 - LimitRequestBody Directive, Apache manual
  2. client_max_body_size, Nginx manual
  3. server.max-request-size, Lighthttpd manual
  4. IIS7是Internet信息服务的新版本(版本7.0),它是Windows Vista和下一个Windows Server版本的一部分。Windows 2008上的
  5. http://xpt.sourceforge.net/techdocs/language/wiki/wikimedia/wkm07-MediaWikiImport/index.html#mass_image_upload_zip_