Chrome からファイルをアップロードするとファイルのタイプがとれない
Windows の Chrome からファイルをアップロードすると、ファイルタイプがとれないみたい。
Chrome のバージョンは8.0。
Chrome からファイルをアップロードしたものをPHPで受けて、
$_FILES を var_dump したらこんな風になる。
array
'file' =>
array
'name' => string 'hogehoge.zip' (length=12)
'type' => string '' (length=0)
'tmp_name' => string '/private/var/tmp/phpURHxui' (length=26)
'error' => int 0
'size' => int 1087323$_FILES['file']['type'] が空文字列になる。
ちなみにFirefoxの場合。
array
'file' =>
array
'name' => string 'hogehoge.zip' (length=12)
'type' => string 'application/zip' (length=15)
'tmp_name' => string '/private/var/tmp/phpURHxui' (length=26)
'error' => int 0
'size' => int 1087323type を見てアップロードされたファイルの種類を判別していると痛い目に遭う。
symfonyではアップロードされたファイルそのものを見ているみたい。
symfony 1.4.7の sfValidatorFile より。
<?php // ...略.../** * Guess the file mime type with PECL Fileinfo extension * * @param string $file The absolute path of a file * * @return string The mime type of the file (null if not guessable) */ protected function guessFromFileinfo($file) { if (!function_exists(’finfo_open’) || !is_readable($file)) { return null; }
<span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">!$</span><span class="synIdentifier">finfo</span> <span class="synStatement">=</span> <span class="synPreProc">new</span> finfo<span class="synSpecial">(</span>FILEINFO_MIME<span class="synSpecial">))</span> <span class="synSpecial">{</span> <span class="synStatement">return</span> <span class="synType">null</span>; <span class="synSpecial">}</span> <span class="synStatement">$</span><span class="synIdentifier">type</span> <span class="synStatement">=</span> <span class="synStatement">$</span><span class="synIdentifier">finfo</span><span class="synType">-></span>file<span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">file</span><span class="synSpecial">)</span>; <span class="synComment">// remove charset (added as of PHP 5.3)</span> <span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synConstant">false</span> <span class="synStatement">!==</span> <span class="synStatement">$</span><span class="synIdentifier">pos</span> <span class="synStatement">=</span> <span class="synIdentifier">strpos</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">type</span>, '<span class="synConstant">;</span>'<span class="synSpecial">))</span> <span class="synSpecial">{</span> <span class="synStatement">$</span><span class="synIdentifier">type</span> <span class="synStatement">=</span> <span class="synIdentifier">substr</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">type</span>, <span class="synConstant">0</span>, <span class="synStatement">$</span><span class="synIdentifier">pos</span><span class="synSpecial">)</span>; <span class="synSpecial">}</span> <span class="synStatement">return</span> <span class="synStatement">$</span><span class="synIdentifier">type</span>;}
// …略…