1

私は共有ホスティングを利用しており、fileinfoを機能させるために彼らと戦ってきましたが、ようやく機能するようになりましたが、新しいファイルアップロードツールを作成しているため、基本的にこれを手に入れました。どのmimetypeがアップロードされているかを知る必要がありますが、fileinfoはボールをプレイしたくありません。

したがって、.sqlファイルはtext/plainを正しく返します。

ただし、他のすべてのファイルは単にapplication / octet-streamを返します。私が疑問に思っているのは、これが事実である理由です。ホストを大量の質問で怒らせたくないので、この問題について調査したいと思います。私が彼らをさらに悩ませる前に。

コード:

function get_mime($filename)
{
    $result = new finfo(FILEINFO_MIME_TYPE, "/usr/share/file/magic.mime"); 
    return $result->file($filename, FILEINFO_MIME_TYPE);
}

echo $user->get_mime($_FILES['file']['tmp_name'][$i]);

どんな助けでも大歓迎です、どうもありがとう

アップデート

そこで、MIMETYPEチェックのコードを更新し、以下を反映するようにコードを更新しました(関数の場合)。

function get_mime($filename)
{
    $result = new finfo(FILEINFO_MIME_TYPE, "/usr/share/file/magic.mime"); // return mime type ala mimetype extension

    if (is_resource($result) === true)
    {
        return $result->file($filename, FILEINFO_MIME_TYPE);
    } else {
        return "failed";
    }

    return false;
}

明らかに、ご覧のとおり、出力が失敗したときに失敗しました。これは100%の確率で発生しており、ifステートメントを削除するとapplication / octet-streamが返されますが、これは正しくありません。

アップロードプロセスは次のようになります。ユーザーのアップロード->ファイルはpublicの上の一時フォルダー(upload_check)に移動され、fileinfoによってチェックされます。ファイルが受け入れられない場合は破棄され、そうでない場合はにコピーされます。パブリックファイルを作成し、一時フォルダから破棄します。

私はそのプロセスを作成しましたが、それでもfileinfoは協力したくなく、public_htmlフォルダーの上に保存されたサーバー上にある場合でも、すべてのapplication/octet-streamを返します。

何かアドバイス?

ジェイク

4

2 に答える 2

3

助言

私は本当にあなたがここで物事を間違っていると思います...

A.ファイルがアップロードされると、ファイルはmime type自動的に$_FILES

echo $_FILES['file']['type'][$i] ;

Bアップロードされていないファイルのmimeを取得する場合、またはクライアントヘッダーが提供するものをより適切に判断する場合は、mime_content_type http://php.net/manual/en/function.mime-content-typeを使用します。 php

echo mime_content_type($fileName);

C.減価償却

mime_content_type&は両方ともFileinfo適切に維持されておらず、減価償却されています。

更新:以前はマニュアルで非推奨として誤ってマークされていましたが、2016年1月14日にhttps://bugs.php.net/bug.php?id=71367で修正されました。ご覧のとおり、サポート7.0は廃止されていません。まったく。

または、次のリンクを参照して交換することをお勧めします

mimeタイプのzipファイルを取得する

http://www.php.net/manual/en/function.mime-content-type.php#87856

D. getID3 http://sourceforge.net/projects/getid3/files/getID3%28%29%201.x/1.9.3/を使用して、いくつかの一般的なファイルの実際のmimeタイプを確認することもできます...

E.Linuxコマンドラインを使用するとおそらくセーバー

$mime = shell_exec("file -bi " . escapeshellarg($file));   

またはMacの場合

$mime = shell_exec("file -b --mime ".escapeshellarg($file));

ついに

なぜ$_FILES['file']['tmp_name'][$i]直接取り組みたいのですか?これは非常に多くの問題を引き起こすことが知られています

試す

$tempDir = ""; // Temp
foreach ( $_FILES ["file"] ["error"] as $key => $error ) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES ["file"] ["tmp_name"] [$key];
        $name = $_FILES ["file"] ["name"] [$key];
        $tempFile = "$tempDir/$name";
        move_uploaded_file ( $tmp_name, $tempFile );
        echo $user->get_mime ( $tempFile );
        unlink ( $tempFile );

    }
}
于 2012-04-29T22:43:55.260 に答える
2

使用しようとしているマジックファイルが存在し、phpで読み取れるかどうかを確認する必要があります。

試す :

$finfo = finfo_open(FILEINFO_MIME, "/usr/share/file/magic.mime");

if (!$finfo) {
    echo "Opening fileinfo database failed";
    exit();
}

finfo_close($finfo);
于 2012-04-29T22:28:53.473 に答える