web-dev-qa-db-ja.com

アップロードされたチェックファイルはcsv形式です

私はPHPでファイルをアップロードしていますが、csvファイルの場合にのみアップロードしたいです。私の構文はコンテンツタイプに適していると思います。 csvファイルの場合は、常にelseステートメントに移動します。ここで私が間違っているのは何ですか?

if (($_FILES["file"]["type"] == "text/csv"))
{

}
else
{

}

コンテンツタイプを変更すると、csvではなくその形式で機能します。

43
theking963

mIMEタイプはtext/csvではない場合があります。システムによっては、読み取り/保存が異なる場合があります。 (たとえば、時々IEは.csvファイルをapplication/vnd.ms-Excelとして送信します)、許可された値の配列を作成し、それに対してテストし、テストするために可能なすべての値を見つけることをお勧めしますに対して。

$mimes = array('application/vnd.ms-Excel','text/plain','text/csv','text/tsv');
if(in_array($_FILES['file']['type'],$mimes)){
  // do something
} else {
  die("Sorry, mime type not allowed");
}

mimeがtext/plainとして返されるかどうかをさらにチェックしたい場合は、preg_matchを実行して、CSVになるのに十分なコンマがあることを確認できます。

70
Alan Cole

ユーザーのOSとブラウザのバージョンに応じて、CSVファイルには多くのMIMEタイプがあります。

これは、現在、CSVファイルのMIMEタイプを検証する方法です。

$csv_mimetypes = array(
    'text/csv',
    'text/plain',
    'application/csv',
    'text/comma-separated-values',
    'application/Excel',
    'application/vnd.ms-Excel',
    'application/vnd.msexcel',
    'text/anytext',
    'application/octet-stream',
    'application/txt',
);

if (in_array($_FILES['upload']['type'], $csv_mimetypes)) {
    // possible CSV file
    // could also check for file content at this point
}
36
ukliviu

常にMIMEタイプに依存できるわけではありません。

準拠: http://filext.com/file-extension/CSV

text/comma-separated-values, text/csv, application/csv, application/Excel, application/vnd.ms-Excel, application/vnd.msexcel, text/anytext

CSVにはさまざまなMIMEタイプがあります。

拡張機能をチェックするのがおそらく最善であり、やはりそれほど信頼性は高くありませんが、アプリケーションにとっては問題ないかもしれません。

$info = pathinfo($_FILES['uploadedfile']['tmp_name']);

if($info['extension'] == 'csv'){
 // Good to go
}

コードはテストされていません。

8
Eddie

それで今日私はこれに出くわしました。

$_FILES['upload_file']['type']を見てアップロードされたCSVファイルのMIMEタイプを検証しようとしましたが、特定のユーザーのさまざまなブラウザー(必ずしも同じユーザーであるとは限りません。 FFでは機能しませんでした)$_FILES['upload_file']['type']は、予想される「text/csv」または「text/plain」ではなく、「application/vnd.ms-Excel」として起動していました。

そのため、私は(IMHO)より信頼性の高いfinfo_ *関数を次のように使用することにしました。

$acceptable_mime_types = array('text/plain', 'text/csv', 'text/comma-separated-values');

if (!empty($_FILES) && array_key_exists('upload_file', $_FILES) && $_FILES['upload_file']['error'] == UPLOAD_ERR_OK) {
    $tmpf = $_FILES['upload_file']['tmp_name'];

    // Make sure $tmpf is kosher, then:

    $finfo = finfo_open(FILEINFO_MIME_TYPE);
    $mime_type = finfo_file($finfo, $tmpf);

    if (!in_array($mime_type, $acceptable_mime_types)) {
        // Unacceptable mime type.
    }
}
5
Garvin

ユーザーが誤って他のファイルをアップロードすることを心配しているので、accept=".csv"タグで<input>を使用することをお勧めします。ユーザーがファイルをアップロードすると、ブラウザーにはcsvファイルのみが表示されます。あなたがより良い解決策を見つけたなら、私も同じことを同じ状態でやろうとしているので私に知らせてください-「信頼できるユーザーが間違いを避けようとしています」

3
Bhavesh Garg

MIMEタイプのオプションは、CSVファイルの検証には最適なオプションではありません。私はこのコードを使用しましたが、これはすべてのブラウザでうまくいきました

$type = explode(".",$_FILES['file']['name']);
if(strtolower(end($type)) == 'csv'){

}
else
{

}
3
Vaibhav Shahu

「受け入れ」と「必要」を単純に使用し、非常に一般的で不要なコーディングを避けます。

0
manish yadav