Skip to main content
  1. Entry/

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">-&gt;</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>;

}

// …略…