|
upload
- <?php
-
- /*
- 文件上传:
- 客户端将指定文件传输到服务器。
- $_FILES
- 文件上传的超全局数组,存储各种上传文件的信息
-
- error 错误号:
- 0 表示成功
- 1 表示上传文件大小超出了约定值。 php.ini 配置 upload_max_filesize = 2M
- 2 表示上传文件大小超出了HTML表单隐藏属性的 MAX_FILE_SIZE 指定的大小
- 3 表示文件值被上传一部分
- 4 表示没有上传的文件
- 6 表示找不到临时文件
- 7 表示文件写入失败
- php.ini
- 限制PHP处理上传文件的大小
- upload_max_filesize = 2M
- 是否开启文件上传
- file_uploads = On
-
- 上传文件的临时路径
- upload_tmp_dir
- */
- // $result = upload('upload_file', './test', 0, []);
- $result = upload('upload_file');
- // 1. 无法知道代码内部错误的细节是什么!
- echo '上传结果:';
- var_dump($result);
- function upload(string $field, string $upload_dir = './upload', int $allowSize = 0, array $allowType = []): bool
- {
- // 获取上传文件的信息
- $files = $_FILES[$field];
- // 限定允许大小
- // $allowSize = 2048000;
- // 0 表示不限制
- // $allowSize = 0;
- // 限定类型
- // $allowType = ['image/png', 'image/gif'];
- // 空 表示不限定
- // $allowType = [];
- // 指定上传文件存储的路径
- // $upload_dir = './upload/';
- // 处理保存文件的路径
- $upload_dir = rtrim($upload_dir, '/') . '/';
- // 确保这个路径存在
- if (!file_exists($upload_dir)) {
- $result = mkdir($upload_dir, 0777, true);
- if (!$result) {
- return 1;
- return false;
- }
- }
- // 1. 确保文件上传的正确
- if ($files['error'] != 0)
- {
- // echo '上传错误';
- return 2;
- return false;
- }
- // 2. 限定大小
- if ($allowSize > 0 && $files['size'] > $allowSize) {
- // echo '超出大小';
- return 3;
- return false;
- }
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($files['type'], $allowType)) {
- // echo '类型不允许';
- return false;
- }
- // 4. 判断是否合法上传
- $is_uploaded_file = is_uploaded_file($files['tmp_name']);
- if (!$is_uploaded_file) {
- return false;
- }
- // 生成随机的文件名字
- $filename = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- // 获取拓展名
- $ext = pathinfo($files['name'], PATHINFO_EXTENSION);
- $saveTo = $upload_dir . $filename . '.' . $ext;
- // 5. 执行上传
- $result = move_uploaded_file($files['tmp_name'], $saveTo);
-
- return $result;
- }
- $code = upload('uploadfile');
- if ($code == 1) {
- echo '路径不存在';
- } else if ($code == 2) {
- echo 'xxxx';
- } else if ($code == 3) {
- echo 'xxxxx';
- }
复制代码 uploads
- <?php
- // 文件上传类
- class Uploads
- {
- // 文件上传的信息
- protected $files = [];
- // 上传配置
- protected $config = [
- // 默认限定大小,为0表示不限制
- 'allowSize' => 0,
- // 默认限定类型,为空表示不限制
- 'allowType' => [],
- // 上传文件保存的目录
- 'uploadDir' => './upload/',
- ];
- // 随机名字的存储
- protected $fileName = '';
- // 文件的拓展名
- protected $ext = '';
- // 构造方法
- public function __construct(string $field, array $config = [])
- {
- if (!isset($_FILES[$field])) {
- return false;
- }
- // 获取上传文件的信息
- $this->files = $_FILES[$field];
- // 合并配置
- $this->config = array_merge($this->config, $config);
- // 创建保存目录
- $this->makedir();
-
- }
- // 创建保存目录
- protected function makeDir()
- {
- // 处理保存文件的路径
- $this->config['uploadDir'] = rtrim($this->config['uploadDir'], '/') . '/';
- // 确保这个路径存在
- if (!file_exists($this->config['uploadDir'])) {
- $result = mkdir($this->config['uploadDir'], 0777, true);
- if (!$result) {
- return false;
- }
- }
- }
- // 错误判断
- protected function checkError()
- {
- // 1. 确保文件上传的正确
- if ($this->files['error'] != 0)
- {
- // echo '上传错误';
- return false;
- }
- }
- // 判断大小
- protected function checkSize()
- {
- // 2. 限定大小
- if ($this->config['allowSize'] > 0 && $this->files['size'] > $this->config['allowSize']) {
- // echo '超出大小';
- return false;
- }
- }
- // 判断类型
- protected function checkType()
- {
- $allowType = $this->config['allowType'];
- // 3. 限定类型
- if (count($allowType) > 0 && !in_array($this->files['type'], $allowType)) {
- // echo '类型不允许';
- return false;
- }
- }
- // 判断合法性
- protected function isUploadFile()
- {
- // 4. 判断是否合法上传
- $is_uploaded_file = is_uploaded_file($this->files['tmp_name']);
- if (!$is_uploaded_file) {
- return false;
- }
- }
- // 生成随机名字
- protected function makeFileName()
- {
- // 生成随机的文件名字
- $this->fileName = md5(mt_rand(0, 1000000) . '_' . time() . '_' . uniqid());
- }
- // 获取拓展名
- protected function extension()
- {
- // 获取拓展名
- $this->ext = pathinfo($this->files['name'], PATHINFO_EXTENSION);
- }
- // 执行上传
- public function uploadFile()
- {
- $this->checkError();
- $this->checkSize();
- $this->checkType();
- $this->isUploadFile();
- $this->makeFileName();
- $this->extension();
- $saveTo = $this->config['uploadDir'] . $this->fileName . '.' . $this->ext;
- // 5. 执行上传
- $result = move_uploaded_file($this->files['tmp_name'], $saveTo);
-
- return $result;
- }
- }
- $config = [
- 'allowSize' => 20,
- ];
- $upload = new Uploads('image', $config);
- $result = $upload->uploadFile();
- var_dump($result);
- echo '<pre>';
- print_r($upload);
- echo '</pre>';
复制代码 from
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- </head>
- <body>
- <form action="./uploads.php" method="post" enctype="multipart/form-data">
- <input type="file" name="image">
- <input type="submit">
- </form>
- </body>
- </html>
复制代码 demo
- <?php
- /*
- 异常处理
- 当代码发送错误之后,我们可以针对错误改变原来的执行流程,同时异常处理可以让我们跟踪错误节点。
- try
- catch
- Exception
- */
-
- /*
- 1. 所有的代码都要放在 try 里面
- 2. 当满足某些条件,触发了异常,它会改变程序的执行流程,抛出异常,转到 catch 中执行。
- */
- try {
- echo 'start:';
- // 业务代码的执行
- $x = 1;
- if ($x > 1) {
- throw new Exception('你的值太大了!', 110);
- }
- echo 'end:';
- } catch(Exception $e) {
- echo 'catch:';
- echo $e->getMessage() . '<br>';
- echo $e->getCode() . '<br>';
- echo $e->getFile() . '<br>';
- echo $e->getLine() . '<br>';
- }
复制代码
|
|