私は最近、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;}
まずcheckTitleメソッドの戻り値を出力します。
checkTitle メソッドに $filename=($_FILES['file']['tmp_name']) があるのはなぜですか
1.
function checkTitle($filename) // ファイルの種類を決定します
{
$filename=( $ _FILES['file']['tmp_name']);
は
function checkTitle($filename) //判断文件类型{ $filename = $filename['tmp_name']);
if(!in_array(checkTitle($_FILES['file']),$type)) //判断上传文件类型{
1.
function checkTitle($filename) //ファイルの種類を決定します
{
$filename=($_FILES['file']['tmp_name'])
PHP code?123function checkTitle として記述する必要があります。 ($filename ) //ファイルの種類を判断します { $filename = $filename['tmp_n...
フォームにアップロードしたファイルの名前は「file」です:
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進数。