本文接下来的内容讲的是如何经过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
首先图片上传有没有错误,若是没有下一步,有则返回错误信息数组
检测文件上传的大小浏览器
检测文件类型,看是否为图片类型前端框架
检测是否为真实图片类型,有些图片多是伪造的,好比咱们把一个文本文件扩展名修改为图片类型,上述几条照样经过服务器
移动服务器临时文件到指定目录框架
针对二、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[]
中的某个值是空值,因此咱们须要对其进行过滤并赋值给一个新数组