4

アップロードされたファイルの MIME タイプを示す次の PHP コードがあります。

<?php

if ($_POST) {

    var_dump($_FILES);

    $finfo = new finfo(FILEINFO_MIME_TYPE);

    var_dump($finfo->file($_FILES['file']['tmp_name']));

} else{
    ?>
    <form method="POST" enctype="multipart/form-data"><input name="file" type="file"><input name="submit" value="send" type="submit"/></form>
    <?php
}

このスクリプトで somefile.csv をアップロードした結果は次のようになります。

array (size=1)
    'file' =>
    array (size=5)
        'name' => string 'somefile.csv' (length=12)
        'type' => string 'text/csv' (length=8)
        'tmp_name' => string '/tmp/phpKiwqtu' (length=14)
        'error' => int 0
        'size' => int 3561
string 'text/x-fortran' (length=14)

もちろん、MIME タイプは text/csv にする必要があります。しかし、私が使用するフレームワーク (Symfony 1.4) は、fileinfo を使用してメソッドを使用します。

また、もう少しテストしたところ、コマンド (Ubuntu の場合)file --mime-type somefile.csvが返さsomefile.csv: text/x-fortranれ、コマンドmimetype somefile.csvが返されたようsomefile.csv: text/csvです。somefile.csv は MSOffice で作成されます (これが問題かどうかはわかりません)。どうやらmimetype素晴らしい MIME データベース ( http://freedesktop.org/wiki/Software/shared-mime-info ) を使用しているようですが、使用しfileていません。

  1. PHP は使用するfileか、mimetypeまたは使用しないか?
  2. さらに、ここで何をすべきかわかりません。アップロードしたファイルの形式が間違っていますか? 別の MIME データベースを使用する必要がありますか? PHP にバグがありますか? ここで何が起こっているのですか?

編集:

Fortran プログラムとして検出される理由は、somefile.csv に次の内容しか含まれていないためです。

somecolumn;
C F;

上記の CSV ファイルの内容は正しいと思いますか? フィールドにスペースが含まれている場合、このフィールドを引用符で囲む必要はありませんよね?

4

2 に答える 2

6

ここには、実際の「マジック」ファイル (MIME タイプの推測に使用される署名データベース) を調べるための Unix ボックスはありませんが、Google で簡単に検索すると、次のことがわかりました。

# $File: fortran,v 1.6 2009/09/19 16:28:09 christos Exp $
# FORTRAN source
0       regex/100       \^[Cc][\ \t]    FORTRAN program
!:mime  text/x-fortran

どうやら、ファイルの先頭をスキャンして、単一の C 文字とスペースで始まる行を探します。これは、Fortran スタイルのコメントと思われます。したがって、誤検知:

somecolumn;
C F;
于 2013-04-24T15:43:32.333 に答える
0

PHP Mimetype の紹介から:

PECL 拡張機能 Fileinfo が同じ機能 (およびそれ以上) をよりクリーンな方法で提供するため、この拡張機能は廃止されました。

このモジュールの関数は、ファイル内の特定の位置で特定のマジック バイト シーケンスを探すことによって、ファイルのコンテンツ タイプとエンコーディングを推測しようとします。これは防弾のアプローチではありませんが、使用されるヒューリスティックは非常にうまく機能します。

この拡張機能は Apache mod_mime_magic から派生したもので、それ自体は Ian F. Darwin によって管理されている file コマンドに基づいています。歴史と著作権の詳細については、ソース コードを参照してください。

PHP Fileinfoの紹介から:

このモジュールの関数は、ファイル内の特定の位置で特定のマジック バイト シーケンスを探すことによって、ファイルのコンテンツ タイプとエンコーディングを推測しようとします。これは防弾のアプローチではありませんが、使用されるヒューリスティックは非常にうまく機能します。

これは、同じ主題に関するいくつかの回答を含む質問です: Detecting MIME type in PHP .

于 2013-04-24T11:47:17.597 に答える