php實現圖片上傳與下載

本文接下來的內容講的是如何經過php實現圖片的上傳與下載php

構建上傳文件前端頁面


這裏我藉助bootstrap前端框架以及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>

其中:
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">隱藏域主要是用來如今文件上傳大小的,設置爲2M=>2*1024*1024=>2097152
<input type="file" accept="image/*" name="file[]" multiple>設置接收文件類型爲圖片格式,可多張圖片上傳,注意name屬性值爲file[]時服務器可接收多圖片編程

後臺服務器圖片上傳處理


文件從前端上傳到服務器以後,服務器獲得上傳文件的信息以後進行處理,主要包括如下幾點:bootstrap

  1. 首先圖片上傳有沒有錯誤,若是沒有下一步,有則返回錯誤信息數組

  2. 檢測文件上傳的大小瀏覽器

  3. 檢測文件類型,看是否爲圖片類型前端框架

  4. 檢測是否爲真實圖片類型,有些圖片多是僞造的,好比咱們把一個文本文件擴展名修改爲圖片類型,上述幾條照樣經過服務器

  5. 移動服務器臨時文件到指定目錄框架

針對二、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", 'jpg', 'png', 'gif'])
{
    $res = [];
    if ($fileInfo['error'] == 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['msg'] = $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['msg'] = "文件寫入失敗";
                break;
            case 8:
                $res["mes"] = "系統錯誤";
                break;
        }
        return $res;
    }
}

服務器接收上傳文件調用處理文件上傳函數upload_fun.php進行處理:

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

$files = getFiles();
foreach ($files as $fileInfo){
    $res = upload_file($fileInfo);
    echo $res["msg"].'<br>';
    $uploadFiles[] = $res["dest"];
}
$uploadFiles = array_values(array_filter($uploadFiles));
print_r($uploadFiles);

$uploadFiles = array_values(array_filter($uploadFiles));這句主要是由於上傳多文件時可能會有個別文件出錯而上傳失敗致使$uploadFiles[]中的某個值是空值,因此咱們須要對其進行過濾並賦值給一個新數組

相關文章
相關標籤/搜索