资讯专栏INFORMATION COLUMN

php实现图片上传与下载

zhoutk / 1957人阅读

摘要:本文接下来的内容讲的是如何通过实现图片的上传与下载构建上传文件前端页面这里我借助前端框架以及图标库,内容很简单就一个图片上传框以及一个提交按钮,代码如下上传图片上传其中隐藏域主要是用来现在文件上传大小的,设置为设置接收

本文接下来的内容讲的是如何通过php实现图片的上传与下载

构建上传文件前端页面

这里我借助bootstrap前端框架以及fontawesome图标库,内容很简单就一个图片上传框以及一个提交按钮,代码如下:


上传图片

其中:
隐藏域主要是用来现在文件上传大小的,设置为2M=>2*1024*1024=>2097152
设置接收文件类型为图片格式,可多张图片上传,注意name属性值为file[]时服务器可接收多图片

后台服务器图片上传处理

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

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

检测文件上传的大小

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

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

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

针对2、3步有人可能会问,我们不是前端已经在隐藏域中限制上传大小了嘛,而且也设置了文件的接收类型,为什么服务器还要进行验证呢?有句话是这么说的,服务器永远不要相信客户端传过来的数据,有过编程经验的人都知道,我们可以在浏览器修改前端的页面结构以及内容,而且还可以伪造数据,前端的验证只是起到过滤的作用,并不能一劳永逸,服务器还是得验证前台传过来的数据

接下来直接看代码,处理文件上传函数upload_fun.php:

 $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进行处理:

";
    $uploadFiles[] = $res["dest"];
}
$uploadFiles = array_values(array_filter($uploadFiles));
print_r($uploadFiles);

$uploadFiles = array_values(array_filter($uploadFiles));这句主要是因为上传多文件时可能会有个别文件出错而上传失败导致$uploadFiles[]中的某个值是空值,所以我们需要对其进行过滤并赋值给一个新数组

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22047.html

相关文章

  • 开箱即用-简洁实用的ImgURL图床相册程序和Zdir目录列表程序(文件管理器)

    摘要:本篇文章就来分享一下两款开箱即用上手容易的图床相册程序和在线文件管理器目录列表程序,由好友开发并维护,非常适合个人站长用作图床相册和文件下载分享。虽然说现在照片还有文件存储等都可以上传到网盘中,但是国内的网盘与国外的网盘存储还有点不一样。以百度网盘与Dropbox对比为例,百度网盘顶多算是一个个人用来存放私人照片和文件的网络硬盘,如果用来分享的话很容易被百度限制或者取消下载。很多的个人站长为...

    番茄西红柿 评论0 收藏2637
  • PHP上传图片的路径保存在数据库中,根据图片路径显示图片

    摘要:鉴于上一篇上传图片到数据库并可以进行显示链接描述有笔友提出了改进意见,下面这篇文章就是采纳改进意见进行修改的另外一种方案。结语本人刚接触不久,自知能力不够水平有限,该文中若存在什么不足或需改进之处还请大家多多指正。 鉴于上一篇《PHP上传图片到数据库并可以进行显示》链接描述有笔友提出了改进意见,下面这篇文章就是采纳改进意见进行修改的另外一种方案。 1、创建数据表 CREATE TABL...

    geekidentity 评论0 收藏0
  • Ueditor结合七牛云存储上传图片、附件和图片在线管理的实现和最新更新

    摘要:版本修复提供多文件上传,解决了以前不能多文件上传问题,最大上传图片张,最大上传附件,如果感觉时间不足可修改中的时间,现在是修复了文件同名上传失败的问题,解决方案是同名上传覆盖,即的方式修复了丢失的问题修改了上一版执行安全漏洞还有个小就是上传 1.0版本修复bug 提供多文件上传,解决了以前不能多文件上传问题,最大上传图片32张,最大上传附件10,如果感觉时间不足可修改getToke...

    xavier 评论0 收藏0
  • PHP文件的上传下载

    一、文件上传的html与PHP注意事项1.form要设定enctype属性,method设置为post。enctype设置为multipart/form-data后,图片上传信息会被列入$_FILES超全局数组,而非$_POST,从而达到真正的上传目的2.设定隐藏input:表示最大上传空间3.PHP配置文件的设置:showImg(https://segmentfault.com/img/bVTJ...

    Flands 评论0 收藏0
  • Nextcloud个人云存储绝佳选择:一键自动安装方法和云盘使用体验

    搭建个人云存储一般会想到ownCloud,堪称是自建云存储服务的经典。而Nextcloud是ownCloud原开发团队打造的号称是下一代存储。初一看觉得口气不小,刚推出来就重新定义了Cloud,真正试用过后就由衷地赞同这个Nextcloud:它是个人云存储服务的绝佳选择。 与ownCloud相比,Nextcloud的功能丝毫没有减弱,甚至由于可以安装云存储服务应用,自制性更强,也更符合用户的...

    Shisui 评论0 收藏0

发表评论

0条评论

zhoutk

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<