PHP(12)文件上传

news2024/10/1 17:19:38

PHP(12)文件上传

  • 一、文件上传原理
  • 二、表单写法
  • 三、预定义变量 $_FILES
  • 四、移动临时文件
  • 五、多文件上传
    • 1. 同名表单
    • 2. 不同名表单
  • 六、多文件处理
    • 1. 同名文件
    • 2. 不同名文件
  • 七、封装文件上传函数

一、文件上传原理

文件从客户机上传至服务器指定目录。

步骤:

  1. 增加文件上传的表单。
  2. 客户机上传文件至服务器。
  3. 服务器操作系统将文件保存在临时目录。
  4. 服务器脚本判断文件有效性,将有效文件从临时目录移动到指定目录。

二、表单写法

  • method 必须是 POST。
  • enctype 必须是 multipart/form-data
    在这里插入图片描述
<body>
<form action="./index.php" method="post" enctype="multipart/form-data">
    <input type="file" name="image"/>
    <input type="submit" name="btn" value="上传文件"/>
</form>
</body>

在这里插入图片描述

三、预定义变量 $_FILES

<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
var_dump($_POST);
var_dump($_FILES);

在这里插入图片描述

  • name => 文件在客户机的名字。
  • type => MIME(多功能互联网邮件扩展)类型。
  • tmp_name => 文件上传到服务器的临时路径。
  • error => 文件上传的错误代号。
  • size => 文件大小。

四、移动临时文件

  • 判断是否为上传的文件:is_uploaded_file()
  • 移动临时文件:move_uploaded_file()
<?php
header("Content-type:text/html;charset=utf-8");
echo '<pre>';
//取得文件信息
$file = $_FILES['image'];

// 移动临时文化
if (is_uploaded_file($file['tmp_name'])) {
    // 是上传文件
    if (move_uploaded_file($file['tmp_name'], 'uploads/' . $file['name'])) {
        echo "文件保存成功";
    }else{
        echo '文件保存失败';
    }
} else {
    // 不是上传文件
    echo '文件上传失败';
}

在这里插入图片描述
在这里插入图片描述

五、多文件上传

1. 同名表单

  • 针对一个内容但是不同文件说明
    在这里插入图片描述
  • 批量上传后,将表单名字形成一个数组,同时将对应的五个要素都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的。
    在这里插入图片描述

2. 不同名表单

  • 针对不同内容,所以表单名字不一样。
    在这里插入图片描述
  • 每个文件都会形成一个属于自己独立的5个元素的数组。
    在这里插入图片描述

六、多文件处理

1. 同名文件

<?php
echo '<pre>';
//遍历处理
$images = $_FILES['image'];
for ($i = 0; $i < sizeof($images['name']); $i++) {
    if (is_uploaded_file($images['tmp_name'][$i])) {
        move_uploaded_file($images['tmp_name'][$i], 'uploads/' . $images['name'][$i]);
        echo $images['name'][$i] . "保存成功" . "<br>";
    }
}

在这里插入图片描述
在这里插入图片描述

2. 不同名文件

<?php
echo '<pre>';
//遍历处理
foreach ($_FILES as $FILE) {
    if (is_uploaded_file($FILE['tmp_name'])) {
        move_uploaded_file($FILE['tmp_name'], 'uploads/' . $FILE['name']);
        echo $FILE['name'] . "保存成功" . "<br>";
    }
}

在这里插入图片描述
在这里插入图片描述

七、封装文件上传函数

  1. 判断文件是否有效
  2. 判断文件存储路径是否有效
  3. 判断文件上传过程是否出错
  4. 判断MIME类型
  5. 判断文件格式
  6. 判断文件大小
  7. 判断是否是上传文件
  8. 文件重命名并移动到指定目录
<?php
header("Content-type:text/html;charset=utf-8");

function upload_single($file, $allow_type, $path, &$error, $allow_format = array(), $max_size = 2000000) {
    # 判断文件是否有效
    if (!is_array($file) || !isset($file['error'])) {
        $error = '不是一个有效的上传文件!';
        return false;
    }
    # 判断文件存储路径是否有效
    if (!is_dir($path)) {
        $error = '文件存储路径不存在';
        return false;
    }
    # 判断文件上传过程是否出错
    switch ($file['error']) {
        case 1:
        case 2:
            $error = '文件超出服务器允许大小';
            return false;
        case 3:
            $error = '文件上传过程中出现问题,只上传了一部分!';
            return false;
        case 4:
            $error = '用户没有选中要上传的文件!';
            return false;
        case 6:
        case 7:
            $error = '文件保存失败!';
            return false;
    }
    # 判断MIME类型
    if (!in_array($file['type'], $allow_type)) {
        $error = '当前文件类型不允许上传';
        return false;
    }
    # 判断文件格式
    $ext = ltrim(strrchr($file['name'], '.'), '.');
    if (!empty($allow_format) && !in_array($ext, $allow_format)) {
        $error = '当前文件格式不允许上传!';
        return false;
    }
    # 判断文件大小
    if ($file['size'] > $max_size) {
        $error = '当前上传的文件超出大小,大小为' . $max_size / 1024 . 'KB';
        return false;
    }
    # 判断是否是上传文件
    if (!is_uploaded_file($file['tmp_name'])) {
        $error = '错误:不是上传文件!';
        return false;
    }
    # 文件重命名
    $fullName = strstr($file['type'], '/', true) . '_' . date("Ymd") . "_";
    for ($i = 0; $i < 4; $i++) {
        $fullName .= chr(mt_rand(65, 90));
    }
    $fullName .= '.' . $ext;
    # 移动到指定目录
    if (move_uploaded_file($file['tmp_name'], $path . '/' . $fullName)) {
        return $fullName;
    } else {
        $error = '文件上传失败';
        return false;
    }
}

$file = $_FILES['image'];
$path = 'uploads';
$allow_type = array('image/jpg', 'image/jpeg', 'image/gif', 'image/png');
$allow_format = array('jpg', 'jpeg', 'gif', 'png');
$max_size = 8000000;

if ($filename = upload_single($file, $allow_type, $path, $error, $allow_format, $max_size)) {
    echo $filename;
} else {
    echo $error;
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redhat7.6升级openssh(超详细)

一、准备工作 从官网下载新版的openssh-7.9p1.tar.gz 准备rhel-server-7.6-x86_64-dvd.iso用于使用yum安装依赖 二、具体升级步骤 1.查看系统版本 [rootredhat ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.6 (Maipo) 2.查看openssh现有版本 …

金三银四面试必看,自动化测试如何解决日志问题

前言 前几天在员群里&#xff0c;有同学问了一个自动化测试实践中遇到的问题&#xff1a; 持续集成的自动化用例很多&#xff0c;测试环境日志level为debug&#xff0c;日志量大概40G/每天&#xff0c;定位问题时日志查询很慢&#xff0c;该怎么解决&#xff1f; 这个问题可…

pytorch基础入门教程

pytorch基础入门教程 Pytorch一小时入门教程 前言 机器学习的门槛并没有想象中那么高&#xff0c;我会陆续把我在学习过程中看过的一些文章和写过的代码以博客的形式分享给大家&#xff0c;和大家一起交流&#xff0c;这个是本系列的第一篇&#xff0c;pytoch入门教程&#x…

软件测试2-测试必须有策略和测试有哪些最高原则

什么是软件测试测试是为发现错误而执行程序的过程。软件测试一个破坏性的过程&#xff0c;甚至是一个施虐的过程&#xff0c;也就是第一天说的“找茬”游戏。 当一个输入框让我输入手机号码时&#xff0c;我偏不&#xff0c;我要输入非手机号码&#xff0c;甚至不填。 当界面提…

定时任务使用总结

定时任务表达式生成工具网站&#xff1a;https://cron.qqe2.com/定时任务选型&#xff1a;xxl-job 官方文档&#xff1a;https://www.xuxueli.com/xxl-job/安装定时任务调度中心 xxl-job-admin第一步、先导入xxl-job的数据库&#xff1a;地址&#xff1a;https://gitee.com/xux…

2.2 多区域集成IS-IS

2.2.2 实验二:多区域集成IS-IS 1. 实验目的  实现IS-IS协议DIS优先级修改 实现IS-IS协议网络类型修改 实现IS-IS协议外部路由引入 实现IS-IS接口cost修改 实现IS-IS路由渗透配置2. 实验拓扑 配置多区域集成IS-IS如图2-5所示: …

Java 万年历、周六日计算、节假日导出

目录 通过 Java 的基本语法来实现万年历 Java 获取一年中所有的周六和周日 Java 节假日导入导出 通过 Java 的基本语法来实现万年历 在 Java 的时间计算方面还有很多好用的工具类&#xff0c;Java 常用的工具类封装框架链接如下&#xff1a;HUTool 框架官网 package com.ta…

企业降本增效的催化剂:敏捷迭代

伴随着开源技术的大爆发&#xff0c;新一代的软件技术如雨后春笋般层出不穷。每家企业在硬件及软件开发上都有许多开源技术可选&#xff0c;目的还是在于提高效率&#xff0c;降低开发成本。 本篇文章&#xff0c;带大家了解下促进企业降本增效的重要理念&#xff1a;敏捷迭代…

前端错误/性能监控(vue)

配置目录结构 错误监听&#xff1a;可以提前发现前端的错误&#xff0c;并且找到对应的位置进行修改。因为等等环境因素可能导致不同的问题&#xff0c;这些问题难以发现&#xff0c;影响用户体验。 性能监听&#xff1a;可以及时发现问题&#xff0c;比如下载的js文件、image时…

Stream流源码分析及技巧(含大量案例)

Stream流源码分析及技巧&#xff08;含大量案例&#xff09; 目录 Stream流源码分析及技巧&#xff08;含大量案例&#xff09; 更新说明 简介&#xff08;这部分摘了部分官方文档&#xff09; 特性 Stream接口关系图 Stream流接口方法 Stream流之间的转换 与Stream流相…

华为OD面试经验分享,尤其注意机试题部分

文章目录招聘流程和背景介绍面试准备机试题目类型和解答技巧在算法部分在操作系统部分面试官提问和答题技巧面试总结和建议推荐一些华为 od 常见的机试题题目&#xff1a;两数之和题目&#xff1a;二叉树的遍历题目&#xff1a;链表反转题目&#xff1a;最大子序和招聘流程和背…

解决QML debugging is enabled.Only use this in a safe environment.警告

系列文章目录 文章目录系列文章目录前言一、警告原因二、解决办法参考前言 我试图运行一个非常简单的程序&#xff0c;当单击退出按钮时关闭窗口&#xff0c;但获取以下输出&#xff0c;前提是包含按钮的应用程序窗口不显示&#xff1a; 您已启用QML调试(实际上它默认启用)&…

CleanMyMac4.12.5最新版Mac系统清理优化工具

CleanMyMac X可以优化Mac系统。mac系统用久了&#xff0c;用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件&#xff0c;还能卸载应用程序。小编给您带来cleanmymac中文版&#xff0c;CleanMyMac是一款Mac系统清理优化工具&#xff0c;使用只需两个…

Java中Synchronized关键字的基本使用方法

Java中Synchronized关键字的基本使用方法 1.简介 Synchronized是java的关键字&#xff0c;synchronized可以保证在同一个时刻&#xff0c;只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作)&#xff0c;synchronized可保证一个线程的变…

动态规划【Day01】| 669 · 换硬币、114 · 不同的路径、116 · 跳跃游戏

秘诀&#xff1a;确定状态转移方程初始条件和边界情况计算顺序 669 换硬币 669 换硬币 题目描述&#xff1a; 给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1。 样…

元宇宙将如何彻底改变 K-12 和高等教育

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;9分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 想象一下&#xff0c;你将作为一个微小的细胞去参观人类的循环系统。这只是元宇…

基于django搭建简单的个人博客

文章目录第一步、在Ubuntu中安装虚拟环境并进入第二步、安装blog所需要的包&#xff0c;在requirements.txt中安装mysqlclient可能会报错&#xff0c;输入下列命令后在安装即可成功第三步、创建好数据库&#xff0c;把测试数据导入第四步、修改DjangoBlog包中 settings中数据库…

企业如何做好EHS环境健康安全管理?

目前随着传统制造业企业安全管理制度的落实&#xff0c;工人的安全意识得到很大的提升&#xff0c;但企业内部的安全管理制度并不能完全避免意外发生。如受限空间人员闯入、特种设备伤人、人员作业不规范、危化品泄露、仓储车间发生火情、有毒有害气体超标等一系列安全隐患。对…

leaflet 修改popup的样式,个性化弹窗(069)

第069个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中修改popup组件的样式,个性化弹窗。主要方法是更改css, 中增加custom-popup类名,style的样式要做穿透处理 >>>.具体方法请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实…

使用Python绘制股票CCI指标曲线

本文使用Python语言绘制一只股票的CCI&#xff08;Commodity channel index&#xff09;曲线&#xff0c;论文参考《Commodity channel index: Tool for trading cyclic trends》&#xff0c;该指标可以用来测量股价、外汇或者贵金属交易是否已超出常态分布范围&#xff0c;​ …