discuz プラグインを作成したいので、このプラグインの機能にはファイルをアップロードする機能が含まれるため、初心者の観点から PHP でファイルをアップロードする方法を学びました。
まず、w3cshool がケースを確認して、彼の言ったことは私のような初心者でも少しは理解できると感じました。
アドレスを貼り付けます: http://www.w3school.com.cn/php/php_file_upload.asp
この説明に続いて、彼はデモを作成し、コードを貼り付けました:
html:
このフォーム ページでは、PHP 初心者として、私がここで学んだ新しいことについてお話しさせていただきます。
1.Form の属性 enctype を Baidu が翻訳したところ、これはサーバーに情報を送信するためのエンコード形式を指定する encode type の略語であることがわかりました。
2. 入力のタイプ属性ファイル、この特別なファイルがアップロードされます。
php:
コードをコピー
//echo phpinfo();
//var_dump($_FILES);die;
if((($_FILES["ファイル"]["タイプ"]=="画像/gif")($_FILES["ファイル"]["タイプ"]=="画像/jpeg")($ _FILES["ファイル"]["タイプ"]=="画像/pjpeg")) && ($_FILES["ファイル"]["サイズ"]
if($_FILES["ファイル"]["エラー"]>0){
echo "エラー: ".$_FILES["file"]["error"]."
";
}その他{
echo "アップロード: ".$_FILES["file"]["name"]."
";
echo "タイプ: ".$_FILES["file"]["type"]."
";
echo "サイズ: ".($_FILES["file"]["size"]/1024)."Kb
";
echo "「.$_FILES["file"]["tmp_name"];
に保存されています」}
if(file_exists("upload/".$_FILES["name"]["name"])){
echo $_FILES["file"]["name"]."すでに存在します。";
}その他{
move_uploaded_file($_FILES["file"]["tmp_name"],"upload/".$_FILES["file"]["name"]);
echo "保存場所: "."upload/".$_FILES["file"]["name"];
}
}その他{
echo "無効なファイル";
}
コードをコピー
このデモをデバッグしているときに問題が発生しました。このデモを実行すると、PHP がアップロードが失敗したことを示す警告を報告しました。
このとき、$_FILES 変数を出力して確認しようと思い、出力したところ、error=1 が見つかり、アップロードされたファイルが php のアップロード ファイル サイズを超えていることがわかりました。 ini が原因でアップロードが失敗します。
これが私の新しい知識ポイントです:
コードをコピー
PHP プログラミング言語における $_FILES システム関数の一般的な使用法は次のとおりです:
$_FILES['myFile']['name'] はクライアントファイルの元の名前を表示します。
$_FILES['myFile']['type'] 「image/gif」などのファイルの MIME タイプ。
$_FILES['myFile']['size'] アップロードされたファイルのサイズ (バイト単位)。
$_FILES['myFile']['tmp_name'] 保存される一時ファイルの名前。通常はシステムのデフォルトです。
$_FILES['myFile']['error'] ファイルアップロードに関するエラーコードです。さまざまなコードの意味は次のとおりです:
0; ファイルは正常にアップロードされました。
1; ファイルサイズがphp.iniでシステムが設定したサイズを超えています。
2 ファイルサイズを超えました
MAX_FILE_SIZE オプションで指定した値。
3; ファイルの一部のみがアップロードされました。
4; ファイルはアップロードされませんでした。
5; アップロードされたファイルのサイズは 0 です。
コードをコピー
この時点で、エラーの原因がわかるはずです。デモを実行したところ、php.ini の制限を超えていることがわかったので、php.ini の設定を変更しました。
この php.ini アップロード制限の変更についての私の感想を要約すると、次のようになります。
まず、PHP アップロード ファイルのサイズ制限を変更するには、php.ini の 2 つのパラメータを変更する必要があります。1 つは、upload_max_filesize で、もう 1 つは、post_max_size です。これら 2 つのパラメータのサイズを変更するだけです。
2番目のステップはphp.iniの場所を見つけることです。私のローカルコンピュータは統合環境なので、php.iniは自分で構築した環境であればphpフォルダの下にあります。見つからない場合は、phpinfo() を実行すると、php.ini ファイルの場所が表示されます。
以上です。私のような初心者でも、w3cshool でデモを実行し、インスタンスのアップロードを完了できます。
ファイルのアップロードに関して、discuz の他のプラグイン作成者によって開発されたプラグインを調べたところ、いくつかの小さな利点が見つかりました。共有するためにここに投稿します。
コードをコピー
$fileTypes = array('mp3','wav') //アップロードできるファイルの種類を定義します
$result = null;
$uploadDir = './mail' //アップロードパス
;if(!submitcheck($_POST['formhash2'])){ //ファイルがアップロードされているかどうかを確認します
if($_POST['upname']==''){ //アップロードされたファイルの名前が空かどうかを判断します
$result=lang('plugin/saya_mails', 'noname');
}その他{
$myfile = $_FILES['myfile'] // アップロードされたファイル情報を取得します
;$myfileType = substr($myfile['name'], strrpos($myfile['name'], ".") + 1) //アップロードされたファイルのサフィックス名を取得する 2 つの方法
$result = lang('plugin/saya_mails', 'big');
} else if (!in_array($myfileType, $fileTypes)) { //アップロードが許可されているタイプかどうかを判断します
$result = lang('plugin/saya_mails', 'type');
} elseif (is_uploaded_file($myfile['tmp_name'])) { //ファイルが HTTP post 経由でアップロードされたかどうかを判断します
$toFile = './source/plugin/saya_mails/mail/ ' . $myfile['名前'];
if (@move_uploaded_file ($ myfile ['tmp_name'], $ tofile) {// ファイルをターゲット ストレージ アドレスにコピーします@是@是 //$end=0;
$result = lang('plugin/saya_mails', 'success');
} else {
$result = lang('plugin/saya_mails', 'unknown');
}
} else {
$result = lang('plugin/saya_mails', 'big');
}
}
}
コードをコピー
w3cshool のアップロード例を比較した結果、この著者の文章の方が完成度が高いと感じました
一般的なプロセスは次のとおりです:
1. ファイルがアップロードされているかどうかを判断します。彼が使用するメソッドは通常、フォームによって渡された隠しパラメーターの値が存在するかどうかを判断するために使用されます。
2. アップロードされたファイルの名前が空かどうかを確認します。これは、彼自身が入力したものです。
3. アップロード サイズを超えているかどうかを確認します
4. ファイル拡張子名を取得し、それが許可されたアップロード ファイル タイプであるかどうかを判断します。
5. ファイルが http ポスト経由でアップロードされたかどうかを確認します。
6. 保存されたファイルを移動します。
上記のプロセスに関して、私が新たに得た知識点を個人的にまとめました。
1. ファイルのサフィックス名の取得に関して、元のプラグイン作成者は関数 strrpos() を使用して「.」の位置を返し、関数 substr() をインターセプトしてアップロードされたファイルのサフィックスを取得しました。ファイル。
ここで、strrpos() 関数ですが、私自身の理解では、文字列の戻り位置の略称であるはずです。もちろん、まだ確認していません。この関数は、文字列内で最後に見つかった文字列の位置を返し、この位置を返します。つまり、後ろから前にチェックして、最初に表示される位置を見つけます。参照アドレス: http://www.w3school.com.cn/php/func_string_strrpos.asp
原作者はこの方法で判断していましたが、Baiduで調べてみたところ、この方法はstrrchr()関数やsubstr()関数と連携させて実装することもできることが分かりましたので、私が考えた方法をコメントさせていただきました。実際、strrchr() 関数は、検索対象の文字列の最後から最後までの文字列を返します。 .cn/php/func_string_strrchr.asp
$_FILES["file"]["type"] で判断するのではなく、上記の 2 つの方法を使用して、アップロードされたファイルのタイプが標準を満たしているかどうかを判断します。 print $ _FILES パラメータはすでに知っていますが、type 属性は判断が難しいです。
2. is_uploaded_file() を使用して、ファイルが http 経由でアップロードされたかどうかを判断します
3. move_uploaded_file() の前の @ は、エラー メッセージと警告をブロックするために使用されます