>  기사  >  백엔드 개발  >  PHP는 이미지 업로드 및 다운로드를 구현합니다.

PHP는 이미지 업로드 및 다운로드를 구현합니다.

高洛峰
高洛峰원래의
2016-11-21 15:40:241165검색

이 기사의 다음 내용에서는 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>

그중:
27e68cb32bce7100eeb6a31d76f6f949숨겨진 필드 주로 현재 파일 업로드 크기에 사용되며 2M=>2*1024*1024=>2097152
2978da92f24f933abc389957ccc0dfad수신된 파일 형식을 이미지 형식으로 설정하면 여러 이미지를 업로드할 수 있습니다. name 속성 값이 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;
    }
}

서버 업로드된 파일을 수신하고 처리를 위해 파일 업로드 함수 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"].&#39;<br>&#39;;
    $uploadFiles[] = $res["dest"];
}
$uploadFiles = array_values(array_filter($uploadFiles));
print_r($uploadFiles);

$uploadFiles = array_values(array_filter($uploadFiles)); 주로 여러 파일을 업로드할 때 개별 파일에 오류가 있을 수 있기 때문입니다. 업로드 실패로 인해 $uploadFiles[]의 값이 null이 되므로 이를 필터링하여 새 배열에 할당해야 합니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.