PHP はアップロードされたファイルの種類を決定します

WBOY
リリース: 2016-06-23 14:02:21
オリジナル
1226 人が閲覧しました

私は最近、PHP ファイルのアップロードに関するコードを書いていますが、常にバグがあり、それらを自分で解決しました。 現在未解決のまま残っている唯一の問題は、
アップロードされたファイルのタイプの決定です。インターネット上で言及されている方法のほとんどは、ファイルの拡張子またはタイプ ($_FILES['file']['type']) を判別するものですが、誰かが拡張子を変更した場合でもアップロードできます。なので、私はこの方法は使いません。
その後、関数を見つけました:

function checkTitle($filename)  //判断文件类型{	$filename=($_FILES['file']['tmp_name']);	$file     = fopen($filename, "rb");	$bin      = fread($file, 2); //只读2字节	fclose($file);	$strInfo  = @unpack("C2chars", $bin);	$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);	$fileType = '';	switch ($typeCode)	{		case 8075:		$fileType = 'zip';		break;		case 8297:		$fileType = 'rar';		break;		case 255216:		$fileType = 'jpg';		break;		case 7173:		$fileType = 'gif';		break;		case 6677:		$fileType = 'bmp';		break;		case 13780:		$fileType = 'png';		break;		default:		$fileType = 'unknown'.$typeCode;	}	//Fix	if ($strInfo['chars1']=='-1' && $strInfo['chars2']=='-40' ){		return 'jpg';	}	    			if ($strInfo['chars1']=='-119' && $strInfo['chars2']=='80' ) 	{		return 'png';	}	return $fileType;}
ログイン後にコピー

この関数は実際のファイルの種類を決定できますが、関数を呼び出すときに使用したのは次のとおりです:
$type=array('.txt','.rtf','.doc', '.docx'、'.xls'、'.xlsx'、'.ppt'、'.pptx'、'.jpg'、'.jpeg'、'.png'、'.bmp'、'.png'、 '.zip','.rar','.7z','.tar','.gz','.tar.gz');
if(!in_array($_FILES['file'][' tmp_name' ]) ,$type)) //アップロードされたファイルの種類を決定します
{
//間違ったファイルの種類のプロンプト
}
$_FILES['file']['name' の場合、赤でマークされた部分] エラーが報告され、$_FILES['file']['tmp_name'] の場合、(写真や rar ファイルをアップロードしても) ファイルの種類が間違っているというメッセージが表示されるのですが、どうすれば正しく記述できますか?


ディスカッションへの返信(解決策)

まずcheckTitleメソッドの戻り値を出力します。
checkTitle メソッドに $filename=($_FILES['file']['tmp_name']) があるのはなぜですか

1.
function checkTitle($filename) // ファイルの種類を決定します
{
$filename=( $ _FILES['file']['tmp_name']);


function checkTitle($filename)  //判断文件类型{    $filename = $filename['tmp_name']);
ログイン後にコピー

2.
if(!in_array(checkTitle($_FILES['file']['tmp_name']),$type) と記述する必要があります。 ) // アップロードされたファイルのタイプを決定します
{

if(!in_array(checkTitle($_FILES['file']),$type)) //判断上传文件类型{
ログイン後にコピー
と書く必要があります
フォーム コントロールの名前が file だけであるとは想定できないため、別の名前が付けられている場合はどうなるでしょうか。

1.
function checkTitle($filename) //ファイルの種類を決定します
{
$filename=($_FILES['file']['tmp_name'])

PHP code?123function checkTitle として記述する必要があります。 ($filename ) //ファイルの種類を判断します { $filename = $filename['tmp_n...
フォームにアップロードしたファイルの名前は「file」です:

まず、checkTitle メソッドの戻り値を出力します。

checkTitle メソッドに $filename=($_FILES['file']['tmp_name']); があるのはなぜですか?
$filename=($_FILES['file']['name']); と書くとエラーが報告されるため、名前を tmp_name に変更する必要がありました

私は自分で問題を解決しました:

1. この時点では一時ファイルは移動されていないため、当然、name を使用する場合は tmp_name のみを使用できます。 , 結果が取得できません(tmp_nameのファイルはサーバー上にあり、nameファイルはクライアント上にあります)
2. 判定できない理由は、array()の値がすべて「」になっているためです。 "、それを削除してください:
$type=array('txt','rtf',' doc','docx','xls','xlsx','ppt','.pptx','jpg',' jpeg','png','bmp','png','zip','rar ','7z','tar','gz','tar.gz');拡張子で判断する方法なので、「.」があります)
これで、ファイルアップロードのコードは完全に正常になりました。さらに、インターネット上で別のコードを見つけました。これは、ファイルヘッダーの最初の4桁を取得して、それを次のように変換します。 16進数。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート