Heim >Backend-Entwicklung >PHP-Tutorial >PHP implementiert das Hochladen und Herunterladen von Bildern

PHP implementiert das Hochladen und Herunterladen von Bildern

高洛峰
高洛峰Original
2016-11-21 15:40:241202Durchsuche

Der folgende Inhalt dieses Artikels befasst sich mit dem Hoch- und Herunterladen von Bildern über PHP

Erstellen einer Front-End-Seite zum Hochladen von Dateien

Hier verwende ich das Bootstrap-Front-End-Framework und Fontawesome-Symbolbibliothek, der Inhalt ist sehr einfach. Es handelt sich lediglich um ein Feld zum Hochladen von Bildern und eine Schaltfläche zum Senden. Der Code lautet wie folgt:

<!--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>

Darunter:
fefb76bc4cecc8a30778b88a3e178a2aversteckte Domäne Wird hauptsächlich für die aktuelle Datei-Upload-Größe verwendet, eingestellt auf 2M=>2*1024*1024=>2097152
276304f6ed3177e3b6962e7e64e0e5b2Stellen Sie den empfangenen Dateityp auf das Bildformat ein. Es können mehrere Bilder hochgeladen werden. Beachten Sie, dass der Server mehrere Bilder empfangen kann, wenn der Namensattributwert file[]

Backend-Server-Bild-Upload-Verarbeitung

Datei vom Frontend Nach dem Hochladen auf den Server erhält der Server die Informationen der hochgeladenen Datei und verarbeitet sie, was hauptsächlich die folgenden Punkte umfasst:

Überprüfen Sie zunächst, ob beim Hochladen des Bildes Fehler vorliegen. Wenn kein nächster Schritt erfolgt, wird eine Fehlermeldung zurückgegeben.

Ermitteln Sie die Größe der hochgeladenen Datei.

Ermitteln Sie den Dateityp Sehen Sie, ob es sich um einen Bildtyp handelt.

Erkennen Sie, ob es sich um einen echten Bildtyp handelt. Wenn wir beispielsweise die Erweiterung einer Textdatei in „Bildtyp“ ändern, werden die oben genannten Elemente weiterhin übergeben

Verschieben Sie die temporäre Serverdatei in das angegebene Verzeichnis

Was die Schritte 2 und 3 betrifft, fragen sich einige Leute vielleicht: Hat unser Frontend die Upload-Größe in der versteckten Domäne nicht bereits begrenzt? , und der Empfangstyp der Datei ist ebenfalls festgelegt. Warum muss der Server sie noch überprüfen? Es gibt ein Sprichwort, dass der Server niemals den vom Client übergebenen Daten vertrauen sollte. Jeder mit Programmiererfahrung weiß, dass wir die Front-End-Seitenstruktur und den Inhalt im Browser ändern und auch Daten und Front-End-Verifizierung fälschen können. Es spielt nur eine Filterrolle und kann nicht ein für alle Mal gelöst werden. Der Server muss noch die von der Rezeption übergebenen Daten überprüfen.

Schauen wir uns den Code direkt an und verarbeiten die Datei-Upload-Funktion 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;
    }
}
Server Empfangen Sie die hochgeladene Datei und rufen Sie die Datei-Upload-Funktion upload_fun.php zur Verarbeitung auf:

<?php
//upload_del.php
require_once "upload_fun.php";

$files = getFiles();
foreach ($files as $fileInfo){
    $res = upload_file($fileInfo);
    echo $res["msg"].&#39;<br>&#39;;
    $uploadFiles[] = $res["dest"];
}
$uploadFiles = array_values(array_filter($uploadFiles));
print_r($uploadFiles);
$uploadFiles = array_values(array_filter($uploadFiles)); Dieser Satz lautet Hauptsächlich, weil es beim Hochladen mehrerer Dateien zu Fehlern in einzelnen Dateien kommen kann. Der Upload-Fehler hat dazu geführt, dass ein Wert in $uploadFiles[] null war, also müssen wir ihn filtern und einem neuen Array

zuweisen

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:[Python]ConfigParser-ModulNächster Artikel:[Python]ConfigParser-Modul