私はPHPでファイルをアップロードしていますが、csvファイルの場合にのみアップロードしたいです。私の構文はコンテンツタイプに適していると思います。 csvファイルの場合は、常にelseステートメントに移動します。ここで私が間違っているのは何ですか?
if (($_FILES["file"]["type"] == "text/csv"))
{
}
else
{
}
コンテンツタイプを変更すると、csvではなくその形式で機能します。
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になるのに十分なコンマがあることを確認できます。
ユーザーの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
}
常に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
}
コードはテストされていません。
それで今日私はこれに出くわしました。
$_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.
}
}
ユーザーが誤って他のファイルをアップロードすることを心配しているので、accept=".csv"
タグで<input>
を使用することをお勧めします。ユーザーがファイルをアップロードすると、ブラウザーにはcsvファイルのみが表示されます。あなたがより良い解決策を見つけたなら、私も同じことを同じ状態でやろうとしているので私に知らせてください-「信頼できるユーザーが間違いを避けようとしています」
MIMEタイプのオプションは、CSVファイルの検証には最適なオプションではありません。私はこのコードを使用しましたが、これはすべてのブラウザでうまくいきました
$type = explode(".",$_FILES['file']['name']);
if(strtolower(end($type)) == 'csv'){
}
else
{
}
「受け入れ」と「必要」を単純に使用し、非常に一般的で不要なコーディングを避けます。