ホームページ > バックエンド開発 > PHPチュートリアル > PHP によるファイルのアップロードに関する一般的な問題の概要、_PHP チュートリアル

PHP によるファイルのアップロードに関する一般的な問題の概要、_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:07:56
オリジナル
933 人が閲覧しました

PHP によるファイルのアップロードに関する一般的な問題の概要

今後ファイルを使用するときに探す必要がないように、PHP でファイルをアップロードするときによく発生する問題のいくつかをまとめてみましょう。

1. まず最も単純なアップロードファイルを作成します

コードをコピーします コードは次のとおりです:


<頭>



<フォームアクション="upload_file.php" メソッド="投稿"
enctype="multipart/form-data">








コードをコピーします コードは次のとおりです:
if (($_FILES["ファイル"]["サイズ"] {
if ($_FILES["ファイル"]["エラー"] > 0)
{
echo "リターン コード: " . $_FILES["file"]["error"] "
";
}
それ以外
{
echo "アップロード: " . $_FILES["ファイル"]["名前"] "
";
echo "タイプ: " . $_FILES["ファイル"]["タイプ"] "
";
echo "サイズ: " . ($_FILES["ファイル"]["サイズ"] / 1024) " Kb
";
echo "一時ファイル: " . $_FILES["file"]["tmp_name"] "
";
If (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["ファイル"]["名前"] . " すでに存在します。 ";
}
それ以外
{
Move_uploaded_file($_FILES["ファイル"]["tmp_name"],
"アップロード/" . $_FILES["ファイル"]["名前"]);
echo "保存場所: " . "upload/" . $_FILES["ファイル"]["名前"];
}
}
}
それ以外
{
echo "無効なファイル";
}
?>

2. 次に、スーパーグローバル変数 $_FILES の値を理解します

コードをコピーします コードは次のとおりです:
$_FILES['ユーザーファイル']['名前']
$_FILES['ユーザーファイル']['タイプ']
$_FILES['ユーザーファイル']['サイズ']
$_FILES['ユーザーファイル']['tmp_name']
$_FILES['ユーザーファイル']['エラー']

そのうち、$_FILES['userfile']['error']のすべての値:

UPLOAD_ERR_OK 値は 0 で、エラーは発生せず、ファイルは正常にアップロードされました。

UPLOAD_ERR_INI_SIZE 値は 1 で、アップロードされたファイルは php.ini の Upload_max_filesize オプションで制限された値を超えています。

UPLOAD_ERR_FORM_SIZE 値は 2 で、アップロードされたファイルのサイズが HTML フォームの MAX_FILE_SIZE オプションで指定された値を超えています。

UPLOAD_ERR_PARTIAL その値は 3 で、ファイルは部分的にのみアップロードされます。

UPLOAD_ERR_NO_FILE その値は 4 で、ファイルはアップロードされません。

UPLOAD_ERR_NO_TMP_DIR の値は 6 で、一時フォルダーが見つかりません。 PHP 4.3.10 および PHP 5.0.3 で導入されました。

UPLOAD_ERR_CANT_WRITE 値は 7 で、ファイルの書き込みに失敗しました。 PHP 5.1.0で導入されました。

3. 多くの状況: アップロードされたファイルの種類を厳密に判断する必要があります

アップロードされたファイルの種類を判断するために $_FILES['userfile']['type'] を使用するのは賢明ではないことはわかっています。判断はファイルのサフィックス名に基づいて行われるため、mp3 ファイルのサフィックスは誰でも変更できるからです。したがって、PHP では、ファイルの MIME を決定するために PHP 拡張子 php_fileinfo を使用することを推奨しています。Win と Linux では、拡張子を有効にする方法がいくつか異なります。

4. シナリオ 1:

アップロードされたファイルの名前を同じ名前に自動的に変更します

コードをコピーします コードは次のとおりです:

if (file_exists("./upload/" . $_FILES["file"]["name"]))
{
   する{
       $suffix =""; 
       $suffix_length = 4; 
       $str = "0123456789abcdefghijklmnopqrstuvwxyz"; 
       $len = strlen($str)-1;
       //文件名後追加4个付机文字
       for($i=0 ; $i           $suffix .= $str[rand(0,$len)]; 
       }
       $upload_filename = $_FILES['ファイル']['名前'];                                           
       $filename = substr($upload_filename,0,strrpos($upload_filename,".")).$suffix.".".substr($upload_filename,strrpos($_FILES["file"]["name"],". ")+1);
   }while(file_exists("./upload/".$filename)); 
       move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $filename); 
}その他{
       move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);  
}

5.情景二:日期分目录上传文件

复制代価代価如下:

$ Structure = './'.date("Y").'/'.date("m").'/'.date("d").'/';
if (!mkdir($structural, 0777, true)) {
    die('フォルダーの作成に失敗しました...');
}
move_uploaded_file($_FILES["ファイル"]["tmp_name"],$struct . $_FILES["ファイル"]["名前"]);

6.情景三:多文件上传

复制代価代価如下:

 <フォームアクション="" メソッド="ポスト" enctype="multipart/form-data">
 

写真:
 
 
 
 
 


 

复制代価代価如下:

   foreach ($_FILES["pictures"]["error"] as $key => $error) {
     if ($error == UPLOAD_ERR_OK) {
         $tmp_name = $_FILES["写真"]["tmp_name"][$key];
         $name = $_FILES["写真"]["名前"][$key];
         move_uploaded_file($tmp_name, "データ/$name");
     }
 }
 ?>

有的情况下多文件的此变量结構造并不好用:

复制代価代価如下:

配列(1) {
    ["アップロード"]=>配列(2) {
        ["名前"]=>配列(2) {
            [0]=>文字列(9)"file0.txt"
            [1]=>文字列(9)"file1.txt"
        }
        ["タイプ"]=>配列(2) {
            [0]=>文字列(10)"テキスト/プレーン"
            [1]=>文字列(10)"テキスト/html"
        }
    }
}

很多情况下我们需要的是似似的構造

复制代価代価如下:

配列(1) {
["アップロード"]=>配列(2) {
[0]=>配列(2) {
["名前"]=>string(9)"file0.txt"
["タイプ"]=>string(10)"テキスト/プレーン"
}、
[1]=>配列(2) {
["名前"]=>string(9)"file1.txt"
["タイプ"]=>string(10)"text/html"
}
}
}

以下の関数を使うと簡単に構造を変換できます

コードをコピーします コードは次のとおりです:

関数多様な配列($vector) {
$結果 = 配列(); foreach($vector as $key1 => $value1)
foreach($value1 as $key2 => $value2)
$result[$key2][$key1] = $value2; $result を返します。 }
$upload = Different_array($_FILES["upload"]);



7. 場合によっては、
最大アップロード ファイル サイズを変更するようにサーバーを設定する必要があります

まずはフォームから

アップロード ファイル サイズを制限する可能性 (バイパス可能)。

その後、サーバー上の構成も調整する必要があります

php.ini:

max_execution_time = 30 各スクリプトの最大実行時間 (秒単位)

max_input_time = 60、各スクリプトが消費できる時間、単位も秒です

Memory_limit = 128M、これはスクリプトによって消費される最大メモリです

post_max_size = 8M、フォームによって送信される最大データは 8M です。この項目は、アップロードされる 1 つのファイルのサイズを制限しませんが、フォーム全体の送信データを制限します。
Upload_max_filesize = 2M、アップロードされるファイルの最大許容サイズ

nginx:

コードをコピーします

コードは次のとおりです: 場所 / {
ルート HTML;
インデックスindex.htmlインデックス.htm;
Client_max_body_size 1000m;
}



上記は一般的な問題に対する解決策です。気に入っていただければ幸いです。

http://www.bkjia.com/PHPjc/953153.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/953153.html技術記事 PHP でファイルをアップロードする際の一般的な問題のまとめ PHP でファイルをアップロードするときによく発生するいくつかの問題をまとめてみましょう。今後ファイルを使用するときにそれらを探す必要はありません。 1. まず、最も単純なアップロード ファイルのコピーを作成します...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート