我在 Gentoo Linux 机器上运行一个私人 mediawiki 服务器,该服务器装有 Apache、PHP 和 Postgresql-9.0。有时当我们中的一个人尝试上传 PDF 文件时(这是我见过的唯一一种文件类型),我们会收到错误:
MediaWiki 内部错误。
原始异常:异常“DBUnexpectedError”,消息为“发生数据库错误查询:UPDATE image SET img_size = '1129473',img_width = '1287',img_height = '1789',img_bits = '0',img_media_type = 'OFFICE',img_major_mime = 'application',img_minor_mime = 'pdf',img_timestamp = '2011-08-31 16:39:11 GMT',img_description = '',img_user = '1',img_user_text = 'Dynamphorous',img_metadata = 'a:15:{s:5:"标题";s:0:"";s:7:"主题";s:0:"";s:8:"关键词";s:0:"";s:6:"作者";s:0:"";s:8:"制作人";s:20:"Pdf-It 版本 1.410";s:12:"创建日期";s:24:"2000 年 7 月 27 日星期四 10:10:25";s:7:"修改日期";s:24:"2000 年 4 月 24 日星期二 06:38:25 2001";s:6:"带标签";s:2:"否";s:5:"页数";s:2:"12";s:9:"已加密";s:2:"否";s:5:"页数";a:12:{i:1;a:1:{s:9:"页面大小";s:13:"618 x 859 pts";}i:2;a:1:{s:9:"页面大小";s:13:"618 x 859 pts";}i:3;a:1:{s:9:"页面大小";s:13:"619 x 859 pts";}i:4;a:1:{s:9:"页面大小";s:13:"619 x 859 pts";}i:5;a:1:{s:9:"页面大小";s:13:"616 x 859 pts";}i:6;a:1:{s:9:"页面大小";s:13:"616 x 859 pts";}i:7;a:1:{s:9:"页面大小";s:13:"615 x 859 pts";}i:8;a:1:{s:9:"页面大小";s:13:"615 x 859 pts";}i:9;a:1:{s:9:"页面大小";s:13:"616 x 859 pts";}i:10;a:1:{s:9:"页面大小";s:13:"615 x 859 pts";}i:11;a:1:{s:9:"页面大小";s:13:"617 x 859 pts";}i:12;a:1:{s:9:"页面大小";s:13:"617 x 859 pts";}}s:9:"文件大小";s:13:"1129473 字节";s:9:"已优化";s:2:"否";s:11:"PDF 版本";s:3:"1.3";s:4:"文本";a:13:{i:0;s:3527:"论文
我要上传的论文全文在此处
";i:12;s:0:"";}}',img_sha1 = '5y3nidgq6von7yjlalvi776tjs8pjbz' WHERE img_name = 'title of paper.pdf' 函数:LocalFile::recordUpload2 错误:1 错误:bytea 类型输入语法无效 LINE 1:...'1',img_user_text = 'Dynamphorous',img_metadata = 'a:15:{s:5... ^ ' in /var/www/localhost/htdocs/includes/db/DatabasePostgres.php:1122 堆栈跟踪:0 /var/www/localhost/htdocs/includes/db/DatabasePostgres.php(538): DatabasePostgres->reportQueryError('ERROR: invalid...', 1, 'UPDATE image S...', 'LocalFile::reco...', false) 1 /var/www/localhost/htdocs/includes/db/Database.php(1212): DatabaseBase->query('更新图像 S...', 'LocalFile::reco...') 2 /var/www/localhost/htdocs/includes/filerepo/LocalFile.php(891): DatabaseBase->update('图像', Array, Array, 'LocalFile::reco...') 3 /var/www/localhost/htdocs/includes/filerepo/LocalFile.php(758): LocalFile->recordUpload2('20110831170017!...', '', '', Array, false, Object(User)) 4 /var/www/localhost/htdocs/includes/upload/UploadBase.php(391): LocalFile->upload('/tmp/phpMxnvZ5', '', '', 1, 数组, false, 对象 (用户)) 5 /var/www/localhost/htdocs/includes/specials/SpecialUpload.php(426): UploadBase->performUpload('', '', false, 对象 (用户)) 6 /var/www/localhost/htdocs/includes/specials/SpecialUpload.php(167): SpecialUpload->processUpload() 7 /var/www/localhost/htdocs/includes/SpecialPage.php(559): SpecialUpload->execute(NULL) 8 /var/www/localhost/htdocs/includes/Wiki.php(254): SpecialPage::executePath(对象 (标题)) 9 /var/www/localhost/htdocs/includes/Wiki.php(64): MediaWiki->handleSpecialCases(对象 (标题), 对象 (输出页面),对象(WebRequest))10 /var/www/localhost/htdocs/index.php(117): MediaWiki->performRequestForTitle(对象(Title)、NULL、对象(OutputPage)、对象(User)、对象(WebRequest))11 {main}
异常处理程序中捕获到的异常:/var/www/localhost/htdocs/includes/db/DatabasePostgres.php:624 中的异常“DBUnexpectedError”,消息为“SQL 错误:错误:当前事务已中止,忽略命令直到事务块结束”堆栈跟踪:
0 /var/www/localhost/htdocs/includes/Interwiki.php(153): DatabasePostgres->fetchRow(false) 1 /var/www/localhost/htdocs/includes/Interwiki.php(57): Interwiki::load('工程') 2 /var/www/localhost/htdocs/includes/Interwiki.php(34): Interwiki::fetch('工程') 3 /var/www/localhost/htdocs/includes/Title.php(2325): Interwiki::isValidInterwiki('工程') 4 /var/www/localhost/htdocs/includes/Title.php(131): Title->secureAndSplit() 5 /var/www/localhost/htdocs/includes/Skin.php(2132): Title::newFromText('工程:El...') 6 /var/www/localhost/htdocs/includes/Skin.php(2085): Skin->addToSidebar(Array, 'sidebar') 7 /var/www/localhost/htdocs/includes/SkinTemplate.php(493): Skin->buildSidebar() 8 /var/www/localhost/htdocs/includes/OutputPage.php(1615): SkinTemplate->outputPage(Object(OutputPage)) 9 /var/www/localhost/htdocs/includes/Exception.php(164): OutputPage->output() 10 /var/www/localhost/htdocs/includes/Exception.php(191): MWException->reportHTML() 11 /var/www/localhost/htdocs/includes/Exception.php(289): MWException->report() 12 /var/www/localhost/htdocs/includes/Exception.php(348): wfReportException(Object(DBUnexpectedError)) 13 [内部函数]: wfExceptionHandler(Object(DBUnexpectedError)) 14 {main}
然后它会给出 PDF 中的所有元数据。(通常是文档的全文)
我知道有几件事不是这样的:这不是 MIME 文件类型黑名单问题,我们一直上传 PDF。这也不是 PHP 上传大小限制(目前引发此错误的 PDF 只有 1.1MB,而在此之前上传的文件要大得多)
有人知道这里的问题是什么吗?我不认为这是一个加密 PDF 问题或类似的愚蠢问题。而且这似乎只发生在具有元数据的 PDF 上,例如完整的 OCR 文本。在此先感谢任何能提供帮助的人。
答案1
如上所述,Mediawiki 仅将元数据存储在数据库中(作为序列化数组),将文件内容写入本地文件系统
这似乎是 Mediawiki 的一个错误,导致它在处理过大的元数据时出现故障,要么是因为它错误地将整个文件内容解析为元数据,要么是因为它甚至无法处理“正确的”元数据。我指望后者,因为你发布的错误包含 UPDATE 查询中的整个 PDF 内容。
我建议在当前 MW 版本的全新安装上尝试相同的 PDF 文件,以确认是否可能是您现有的配置设置或扩展之一导致此问题;然后在当前版本(或 1.18.0 测试版)上再试一次,看看它是否仍然存在。