2011-04-23 58 views
1

如果文件是真实的,我将检查服务器端(PHP)。或者不是。目前我写道:如何检查文件类型

if(substr($_FILES['tracklistFile']['name'], -3)=='txt') 

但我认为它不是最好的解决方案!我如何检查它?

+4

让我们问倒过来:你会*不*是一个真正的文本文件?你需要使用什么标准? – 2011-04-23 18:53:49

+0

呃...例如,如果用户调用'picture.jpg'作为'picture.txt',这个检查将失败,并且我的脚本可能会产生很多错误:)将不受控制:) – markzzz 2011-04-23 18:54:56

+1

与真实话题无关,而不是片状'substr -3'你应该用'(strrchr($ _ FILES [“whatever”] [“name”],“。”)==“.txt”)' – mario 2011-04-23 19:01:40

回答

3

为了可靠地获取文件扩展名,使用此:

pathinfo($_FILES['tracklistFile']['name'], PATHINFO_EXTENSION); 

这将,但是,只给你这样 - 文件名的扩展部分。它没有提到文件的实际类型。

如果文件是服务器上的本地文件(而不是上载文件),则可以在大多数基于Unix的操作系统上调用file命令。

2

呃... ...例如,如果用户呼叫picture.jpg作为picture.txt该检查将失败,和我的脚本可以创建许多错误:)不会受到控制:)

好的,但是除了有效的文本文件外,您会以什么标准告诉无效的JPG?理论上文本文件可以包含任何东西。它没有定义的格式,它只是由许多完全任意的字节组成。

@Sardine建议的MIME类型检测将会有同样的问题;但是,它将能够检测到许多文件类型,而不是文本文件,因此您可以拒绝这些文件类型。不过,它不会100%可靠。

您需要考虑一些允许您识别文本文件的规则,具体取决于您的脚本将如何处理它们。

如果只是为了查明它是否是一个文本文件,我会考虑不做任何检查。您只需确保它在应用程序的每个步骤中都被视为文本文件(即,如果它包含PHP,JavaScript或HTML代码,则不会执行它)。

+0

事实上,我发现如果我将我的文件命名为'$ tracklistFile_name = time()。rand(1,1000)',然后使用'move_uploaded_file'(不带扩展名)移动它,它就可以正常工作。 – markzzz 2011-04-23 23:27:38

2

如果可能的话,您可以检查该文件的MIME类型应该是

text/plain 

这是不幸的是PHP一项棘手的任务。如果使用的是PHP4,你可以使用以下命令:

$mtype = mime_content_type($file_path); 

如果你有PHP> = 5.3.0 & PECL的FileInfo> = 0.1.0,您可以使用类似:

$finfo = finfo_open(FILEINFO_MIME); 
$mtype = finfo_file($finfo, $file_path); 
finfo_close($finfo); 

如果这些都不起作用,我会建议至少确保它不像使用其他答案中讨论的方法的图片那样。如果不能使用这些功能,只能通过检查文件名的不幸方法来确定文件类型,这种方式根本不可靠。

来源:

http://www.php.net/manual/en/book.fileinfo.php

http://forums.digitalpoint.com/showthread.php?t=522166

+0

只是想说明您可能想使用'FILEINFO_MIME_TYPE'而不是'FILEINFO_MIME'。伟大的发现否则! – Cashew 2013-02-06 06:47:30