ホームページ  >  記事  >  バックエンド開発  >  PHP は画像のアップロードとダウンロードを実装します

PHP は画像のアップロードとダウンロードを実装します

高洛峰
高洛峰オリジナル
2016-11-21 15:40:241131ブラウズ

この記事の次の内容は、php を介して画像をアップロードおよびダウンロードする方法について説明します

ファイルをアップロードするためのフロントエンド ページの構築

ここでは、ブートストラップ フロントエンド フレームワークと fontawesome アイコン ライブラリを使用します。内容は非常に単純です。画像アップロード ボックスと送信ボタンだけのコードは次のとおりです:

<!--form.php-->
<div class="container">
    <form action="upload_del.php" method="post" enctype="multipart/form-data" class="form-horizontal">
        <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
        <div class="btn btn-success fileBox">
            <span>
                <i class="fa fa-file-image-o"></i>
                上传图片
            </span>
            <input type="file" accept="image/*" name="file[]" multiple>
        </div>
        <input type="submit" value="上传" class="btn btn-primary">
    </form>
</div>

そのうち:
1dd37134818e1d0761e3a7025ae207cehidden フィールドは主に次の目的で使用されます。現在のファイルアップロードサイズを決定し、2M=>2* 1024*1024=>2097152
6302226f2053b77af854b1049561dd09受信を設定しますファイル形式を画像形式にすると、複数の画像をアップロードできます。 file[] の場合、サーバーは複数の画像を受信できます

ファイルがサーバーにアップロードされた後、フロントエンドから、サーバーはアップロードされたファイルの情報を取得して処理します。これには主に次の点が含まれます:

まず、画像のアップロードにエラーがありますか?次のステップがない場合は、エラー メッセージが表示されます。返される可能性があります

アップロードされたファイルのサイズを検出します

ファイルタイプを検出して画像タイプかどうかを確認します

それが本物の画像タイプであるかどうかを確認します。一部の画像は偽物である可能性があります。たとえば、上記の手順は、

一時サーバー ファイルを指定されたディレクトリに移動することによって行われます

手順 2 と 3 について疑問に思う人もいるかもしれませんが、フロントエンドはすでに制限されているのではないでしょうか。隠しドメインのアップロード サイズも設定されていますが、なぜサーバーがそれを確認する必要があるのでしょうか?サーバーはクライアントから渡されたデータを決して信頼すべきではない、という格言があります。プログラミングの経験がある人なら誰でも、ブラウザーでフロントエンド ページの構造やコンテンツを変更できること、またデータやフロントエンド検証を偽造できることを知っています。これはフィルタリングの役割を果たしているだけであり、一度に解決することはできません。次に、ファイル アップロード関数 Upload_fun.php:

<?php

/**
 * 获取上传文件信息,处理单文件和多文件上传
 * @return array 上传文件信息
 */
function getFiles()
{
    $i = 0;
    $files=[];
    foreach ($_FILES as $file) {
        if (is_string($file["name"])) {
            $files[$i] = $file;
            $i++;
        } elseif (is_array($file["name"])) {
            foreach ($file["name"] as $key => $val) {
                $files[$i]["name"] = $file["name"][$key];
                $files[$i]["type"] = $file["type"][$key];
                $files[$i]["tmp_name"] = $file["tmp_name"][$key];
                $files[$i]["error"] = $file["error"][$key];
                $files[$i]["size"] = $file["size"][$key];
                $i++;
            }
        }
    }
    return $files;
}

/**
 * 获取文件的扩展名
 * @param $filename:文件名
 * @return string 扩展名
 */
function getExt($filename)
{
    return strtolower(pathinfo($filename, PATHINFO_EXTENSION));
}

/**
 * 生成唯一字符串作为文件名
 * @return string 唯一文件名
 */
function getUniName()
{
    return md5(uniqid(microtime(true), true));
}

/**
 * 上传文件主处理模块
 * @param $fileInfo:文件信息
 * @param string $path:上传文件路径
 * @param bool $flag:是否开启验证是否为真实图片
 * @param int $maxSize:文件最大上传大小
 * @param array $allowExt:允许的文件扩展名
 * @return array 信息
 */
function upload_file($fileInfo, $path = "./uploads", $flag = true, $maxSize = 2*1024 * 1024, $allowExt = ["jpeg", &#39;jpg&#39;, &#39;png&#39;, &#39;gif&#39;])
{
    $res = [];
    if ($fileInfo[&#39;error&#39;] == UPLOAD_ERR_OK) {
        $ext = getExt($fileInfo["name"]);
        $uniName = getUniName();
        $dest = $path . "/" . $uniName . "." . $ext;
        //检测上传文件大小
        if ($fileInfo["size"] > $maxSize) {
            $res["msg"] = $fileInfo["name"] . "上传文件过大";
        }
        //上传文件类型
        if (!in_array($ext, $allowExt)) {
            $res["msg"] = $fileInfo["name"] . "非法文件类型";
        }
        //检测是否为真实图片
        if ($flag) {
            if (!getimagesize($fileInfo["tmp_name"])) {
                $res["mes"] = $fileInfo["name"] . "不是真实图片";
            }
        }
        if ($res) return $res;
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
        }
        if (!@move_uploaded_file($fileInfo["tmp_name"], $dest)) {
            $res[&#39;msg&#39;] = $fileInfo["name"] . "文件上传失败";
        } else {
            $res["msg"] = $fileInfo["name"] . "文件上传成功";
            $res["dest"] = $dest;
        }
        return $res;
    } else {
        //判断错误信息
        switch ($fileInfo["error"]) {
            case 1:
                $res["mes"] = "上传文件超过php配置文件中upload_max_filesize选项的值";
                break;
            case 2:
                $res["mes"] = "超过了表单MMAX_FILE_SIZE限制的大小";
                break;
            case 3:
                $res["mes"] = "文件部分被上传";
                break;
            case 4:
                $res["mes"] = "没有选择上传文件";
                break;
            case 6:
                $res["mes"] = "没有找到临时目录";
                break;
            case 7:
                $res[&#39;msg&#39;] = "文件写入失败";
                break;
            case 8:
                $res["mes"] = "系统错误";
                break;
        }
        return $res;
    }
}

を処理するコードを直接見てみましょう。サーバーはアップロードされたファイルを受信し、PHP の処理ファイルアップロード関数 Upload_fun を呼び出して処理します。ファイルをアップロードすると失敗し、 $uploadFiles[] の特定の値が null 値になるため、それをフィルタリングして新しい配列に割り当てる必要があります

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。