手册:配置文件上传
MediaWiki支持上传和整合媒体文件。 本页从技术方面描述此特性,关于一般使用方面请看Manual:图片管理 和Help:图片 页面。
出于安全考虑,从MediaWiki的1.1版起,上传功能默认被禁用。 通过配置可以启用上传功能,但建议你先检查确认一下先决条件。
先决条件
确保上传功能在PHP中启用
php.ini 中需有如下设置:
file_uploads = On
如无此设置,PHP脚本中不能使用上传功能,并且MediaWiki的上传也不能启用。
如果設定了"open_basedir"项,那么此项须包含你的MediaWiki安裝中的上传文件夹("{$IP}/images")和'upload_tmp_dir'文件夹(如果未设定則使用系统默认文件夹)。 If this is in effect, also check if your hoster has properly configured 'sys_temp_dir', because sometimes they forget about that as well and you cannot write temporary files at all (upload, session or any other tmp file).
添加'upload_tmp_dir'可以避免像找不到文件/var/tmp/php31aWnF这样的消息(在这个例子中'upload_tmp_dir'是'/var/tmp')。 阅读File 文件上传基础知识,特别是move_uploaded_file()以了解有关PHP文件上传的更多信息。
Windows 与 IIS 用户检查
设置%SystemRoot%\TEMP
拥有Internet来宾帐户的权限(IUSR
_MachineName或对于IIS 7+:IUSR
):读、写、执行
检查目录安全性
需要配置上传目录,以便最终用户无法上传和执行其他脚本,这些脚本可能会利用对您的Web目录的访问权并损坏您的Wiki或Web站点。
设置/images
文件夹(或以前版本中的/uploads
文件夹)以获得权限“755”:
- 用户可以读、写和执行。
- 组可以读和执行。
- 任何人都可读和执行。
如果使用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';
但是,某些文件扩展名被禁止($1,MediaWiki 1.36及更早版本为$2),即使添加到$wgFileExtensions也无法上传。 要上传带有被禁止的扩展名的文件,您必须修改$wgProhibitedFileExtensions 。 例如,允许用户上传可执行文件:
$wgFileExtensions[] = 'exe';
$wgProhibitedFileExtensions = array_diff( $wgProhibitedFileExtensions, [ 'exe' ] );
另外,$wgMimeTypeExclusions (之前为$3)根据MIME类型防止某些文件类型,例如,基于MIME类型(MediaWiki版本1.14至1.17)禁止.zip文件。
你也可以设置$wgStrictFileExtensions
$wgStrictFileExtensions = false;
允许上传大多数类型的文件。但仍不允许被禁止的文件类型和MIME类型。
如果您收到错误“文件已损坏或扩展名不正确”,请确保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 中的配置代码将要上载的文件大小限制为2M(并将POST操作的最大大小限制为8M)。 要允许上传更大的文件,请在php.ini中编辑这些参数:
- post_max_size,默认为8M
- upload_max_filesize,默认为2M
这可能需要服务器的root用户权限。 (如果您在共享主机上,请与服务器管理员联系。)
- 找到php.ini文件
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]
Ubuntu 16.04: sudo service apache2 restart
(例如,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 上传限制
<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
直接从 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;
请注意,允许直接从网络上的任意位置上传,可以更轻松地上传随机的,不需要的内容,并且可能会被误解为上传人们可能在网络上遇到的任何内容的邀请。
$wgHTTPProxy
。 您可以直接提供它,或者,如果您的服务器提供环境变量http_proxy
,请参阅您的phpinfo()
,然后您可以在LocalSettings.php
中使用以下代码:/*
* Proxy to use for CURL requests.
*/
if ( isset( $_ENV['http_proxy'] )) $wgHTTPProxy = $_ENV['http_proxy'];
大规模上传
有许多工具可以一次上传多个文件,而不是分别上传每个文件:
扩展 | 描述 | 发布状态 | 必要条件 |
---|---|---|---|
Extension:上传向导 | Used on Wikimedia Commons | 稳定版 | MediaWiki 1.23+ |
Extension:MsUpload | 允许用户上传多个文件,包括拖放文件。 | 稳定 | 1.32+ |
Extension:简单批量上传 | 将多个文件基本、简单地上传到MediaWiki | 稳定 | 1.31+ |
Extension:VisualData/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 .
| ||
importImages.php | "Place the files on the server in a readable location and execute the maintenance/importImages.php script from the command line."[5]
|
上传目录
每当上传图像时,都会创建几件事:
- 文件命名空间中的文章,其中包含文件名,例如文件:MyPicture.png。 此页面已存储,可以像任何其他页面一样进行编辑。
- 文件本身存储在文件系统的文件夹中,该文件系统在
$wgUploadDirectory
中配置,或者在其子文件夹中配置为一个(见下文)。 - 如果可以使用缩略图,将创建该文件的缩略图版本(例如,在文件描述页面上使用)。 它们存储在图像目录的缩略图目录中,位于每个主文件的单独目录中。
如果启用$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
包含点时,它允许上传。
参见
- 安全部分上传安全性
- 手册:配置设置#上傳获取与文件上载相关的所有配置变量的列表
- 分类:上传变量 - 类似的列表(按英文字母排列)
- 您在尝试上传文件时看到一个空白页面
- 添加新的支援檔案類型
參考資料
- ↑ core - Apache HTTP Server Version 2.4 - LimitRequestBody Directive, Apache manual
- ↑ client_max_body_size, Nginx manual
- ↑ server.max-request-size, Lighthttpd manual
- ↑ IIS7是Internet信息服务的新版本(版本7.0),它是Windows Vista和下一个Windows Server版本的一部分。Windows 2008上的
- ↑ http://xpt.sourceforge.net/techdocs/language/wiki/wikimedia/wkm07-MediaWikiImport/index.html#mass_image_upload_zip_