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 1087323
type を見てアップロードされたファイルの種類を判別していると痛い目に遭う。
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>;
}
// …略…