• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

php实现图片上传与下载

php 搞代码 4年前 (2022-01-23) 39次浏览 已收录 0个评论

本文接下来的内容讲的是如何通过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[]时服务器可接收多图片

后台服务器图片上传处理

文件从前端上传到服务器之后,服务器得到上传文件的信息之后进行处理,主要包括以下几点:

首先图片上传有没有错误,如果没有下一步,有则返回错误信息

检测文件上传的大小

检测文件类型,看是否为图片类型

检测是否为真实图片类型,有些图片可能是伪造的,比如我们把一个文本文件扩展名修改成图片类型,上述几条照样通过

移动服务器临时文件到指定目录

针对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", '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["m<a>本2文来*源gao($daima.com搞@代@#码(网</a><strong>搞gaodaima代码</strong>es"] = "上传文件超过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.phprequire_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[]中的某个值是空值,所以我们需要对其进行过滤并赋值给一个新数组


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php实现图片上传与下载

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址