PHP文件上传支持哪些文件类型?

3

PHP文件上传支持哪些文件类型?

   Choose a file to upload: <input name="uploadedfile" type="file" />
   <br />
      Username:<input type="text" name="username">
   <br />
      Password:<input type="text" name="password">
   <br />
      FaxNumber:<input type="text" name="faxnumber">

   <input type="submit" value="Upload File" />

7个回答

4

PHP不会对上传的文件类型进行限制。一个文件只是数据,PHP在文件被“提交”(或上传)到服务器后就会将这个数据提供给你。它不会检查文件内容以确定其是什么类型的数据,实际上,它只是在说“这些数据已经上传了,这是临时文件的路径”。只要你的服务器能够接收整个文件,PHP就可以接受任何类型的文件。是否要限制可上传的文件类型完全由你决定。


1

客户端没有限制,支持所有文件/类型。PHP也没有内置限制,并支持所有文件。如果您想在PHP中限制上传的内容,可以使用以下代码片段,将文件限制为gif图像:

if ($_FILES["file"]["type"] == "image/gif"){
    //do stuff here
}
else{
    //the file was wrong type handle error here
}

您可以在上面的代码中找到"MIME类型列表",其中包括"image/gif",链接如下:
http://en.wikipedia.org/wiki/Internet_media_type#List_of_common_media_types


2
不要使用 $_FILES['type'],它是完全任意的、未经验证的数据。 - deceze
1
@deceze 我同意确保服务器安全需要许多其他步骤,例如使用.htaccess文件、上传到服务器根目录之外的目录、防止覆盖现有文件等。然而,它们似乎超出了问题的范围。 $_FILES['type'] 不一定有效,但如果它设置为不允许的内容,我们可以在此时停止上传。 - vdbuilder
图像类型通常能够被正确识别,但其他文件类型可能会或可能不会由客户端设置其正确的MIME类型。因此,您可能会得到错误的负面结果。此外,这个值很容易被欺骗,所以仅使用它作为您唯一的文件类型检查是不安全的(安全性取决于您对这些文件的处理方式)。因此,如果您真的对MIME类型感兴趣,您仍然需要进行自己的检查。 - deceze

1

0
by default: nearly anything you want (pdf,txt,exe,jpg) etc.

你的工作是过滤掉任何你不想使用的东西。 你可以针对 $_FILES 数组中的任何内容(类型、大小等)进行过滤。


0

PHP将支持所有文件类型的文件上传,但您必须验证一些可能会黑客攻击您网站的文件扩展名,并且您还必须考虑文件大小以避免长时间运行的脚本。


0

PHP不处理上传。上传由http规范支持,应由您的Web服务(Apache、IIS等)处理。

无论如何,如果您只想保存上传的文件,则所有文件类型都应该可以正常工作。如果您想将上传的文件作为输入进行处理,则情况会变得更加复杂。


0

您可以上传任何文件,PHP 不会对其进行限制。您需要自行进行限制。

关于客户端文件格式的限制,请参考此 在使用时限制文件格式?

<input type="file" accept="image/*" /> <!-- all image types --> 
<input type="file" accept="audio/*" /> <!-- all audio types --> 

对于服务器,您可以通过以下方式过滤上传的文件:

if(in_array(mime_type($file_path),$allowed_mime_types)){
    // save the file
}

$allowed_mime_types = array(
        'image/jpeg',
        'image/jpg',
        'image/png',
        'image/gif',
        'video/mp4'
);


/*
For PHP>=5.3.0, you can use php's `finfo_file`([finfo_file](https://www.php.net/manual/en/function.finfo-file.php)) function to get the file infomation about the file.

For PHP<5.3.0, you can use your's system's `file` command to get the file information.
*/
function mime_type($file_path)
{
    if (function_exists('finfo_open')) {            
        $finfo = new finfo(FILEINFO_MIME_TYPE, null);
        $mime_type = $finfo->file($file_path);
    }
    if (!$mime_type && function_exists('passthru') && function_exists('escapeshellarg')) {
        ob_start();
        passthru(sprintf('file -b --mime %s 2>/dev/null', escapeshellarg($file_path)), $return);
        if ($return > 0) {
            ob_end_clean();
            $mime_type = null;
        }
        $type = trim(ob_get_clean());
        if (!preg_match('#^([a-z0-9\-]+/[a-z0-9\-\.]+)#i', $type, $match)) {
            $mime_type = null;
        }
        $mime_type = $match[1];
    }
    return $mime_type;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接