PHP---文件上传

news2024/9/23 11:15:59

目录

一、文件上传的概念

二、文件上传的步骤

(1)表单的制作

三、$_FILES详解

(1)name

(2)tmp_name

(3)type

(4)error

(5)size

 四、移动临时文件到目标位置

 五、多文件上传

(1)同名表单

 1:同名文件的数据结构

 2:同名文件的处理方式

(2)不同文件名

 1:不同文件名的数据结构

 2:不同文件名的处理方式


一、文件上传的概念

文件上传就是文件从用户本地电脑通过传输方式(web表单)保存到服务器所在电脑指定的目录下。
那么文件上传的原理是什么呢?
用户通过文件上传的表单从本地选择文件上传到服务器,服务器操作系统会将文件保存到临时文件夹中,注意是临时文件夹中,然后服务器开始工作,先判断文件是否有效,然后服务器脚本将有效文件从临时文件夹移动到指定目录下

二、文件上传的步骤

(1)表单的制作

1:method属性:表单提交方式必须为post
2:enctype属性:form表单属性,主要是规范表单数据的编码方式
在文件上传时,必须等于的值为multipart/form_data
3:上传表单:file表单 

 

<body>
    <form method="post" enctype="multipart/form-data" action="xyy.php">
        <input type="file" name="wenjian" />
        <input type="submit" name="btn" value="提交" />
    </form>
</body>

三、$_FILES详解

在接收到上传的文件后,服务器端如何接受呢,这就要说到预定义变量$_FILES,它是专门用来存储用户上传的文件的。要注意上传的文件并不是$_POST接收的,而是$_FILES。同时使用$_FILES接受后他会有六个属性,如下图所示。

 第一个[wenjian]就是上传文件的name值,后面的name,full_path,type,tmp_name,error,size便是说的属性

(1)name

文件在(浏览器端)用户电脑上的名字。(实际用来看文件的后缀)

(2)tmp_name

文件上传到服务器上操作系统保存到临时路径(实际用来给PHP后期使用)

(3)type

MIME(多功能互联网邮件扩展)类型,用来在计算机客户端识别文件类型,就是比如说一个文件用什么打开,用word打开还是记事本等等。 (实际用来判断给什么软件使用)

(4)error

文件上传的代号,用来告知应用软件(PHP)文件接收过程中出现了什么问题。如:
值=0,没有错误发生,文件上传成功
值=1,上传的文件超过了php.in中upload max filesize选项限制的值
值=2,上传的文件大小超过了HTML表单中MAX_FILE_SIZE选项指定的值
值=3,文件只有部分被上传
值=4,没有文件被上传


值=6,找不到临时文件夹,也就是说操作系统对应的临时文件夹不存在
值=7,文件写入失败,也就是说PHP没有权限将临时文件夹移动到
指定目录

 

 (实际用来PHP后期根据代码进行文件判断)

(5)size

文件大小(实际用来判断文件是否保留) 

 四、移动临时文件到目标位置

临时文件移动到目标位置主要分为两步
(1)判断是否是上传的文件is_uploaded_file()
(2)移动文件move_uploaded_file()

 既然想要移动文件,首先我们得获取文件信息,$_FILES['name']可以获取文件,其中的name是表单中的name属性值,获取后我们便需要判断文件是否是上传文件,即is_uploaded_file($_FILES['name']['tmp_name'])需要获得临时路径来判断。

move_uploaded_file($_FILES['name']['tmp_name'],指定路径),他们都有一个返回值,即是否成功,成功为true,否则为false。

<?php
   header('content-type:text/html;charset=utf-8');
   $f=$_FILES['wenjian'];
   //获取文件
   if(is_uploaded_file($f['tmp_name'])){
	   if(move_uploaded_file($f['tmp_name'],'upload/'.$f['name'])){//这个upload是在apache下的htdocs创建好的
		   echo '保存成功';
	   }
	   else{
		   echo '保存失败';
	   }
   }
   else{
	   echo '文件上传失败';
   }
?>

 

<body>
    <form method="post" enctype="multipart/form-data" action="xyy.php">
        <input type="file" name="wenjian" />
        <input type="submit" name="btn" value="提交" />
    </form>
</body>

 五、多文件上传

多文件上传顾名思义就是上传多个图片,而上传多个图片又分为同名表单和批量解决问题
在具体的实例中

同名表单:当商品需要上传多个图片进行展示的时候,如上传的是同一个物品的不同角度,这时候就用到[]就行。

批量解决问题:取得name属性都不一样

(1)同名表单

             1:同名文件的数据结构

 

<?php
   header('content-type:text/html;charset=utf-8');
   echo '<pre>';
   print_r($_FILES);
?>

<body>
    <form method="post" enctype="multipart/form-data" action="xyy.php">
        <input type="file" name="image[]" />
        <input type="file" name="image[]" />
        <input type="file" name="image[]" />
        
        <input type="submit" name="btn" value="提交" />
    </form>
</body>

 同名表单将名字形成一个数组,而且同时将文件对应的五个要素:name,tmp_name,size,type,error都形成对应数量的数组,每个文件上传对应数组元素的下标都是一样的,如:name[0]和tmp_name[0]都属于同一个文件。

           2:同名文件的处理方式

<?php
   header('content-type:text/html;charset=utf-8');
   echo '<pre>';
   //先判断文件是否存在并且是不是数组即是不是同名文件
   if(isset($_FILES['image']['name'])&&is_array($_FILES['image']['name'])){
	   $images=array();
	   foreach($_FILES['image']['name'] as $k=>$file){
		   //这个k就相当于数字下标
		   $images[]=array(
		   'name'=>$file,
		   'tmp_name'=>$_FILES['image']['tmp_name'][$k],
		   'type'=>$_FILES['image']['type'][$k],
		   'error'=>$_FILES['image']['error'][$k],
		   'size'=>$_FILES['image']['size'][$k]
			   );
	   }
   }
   print_r($images);
   //开始遍历数组一个一个保存
   foreach($images as $f){
	   if(is_uploaded_file($f['tmp_name'])){
		   move_uploaded_file($f['tmp_name'],'upload/'.$f['name']);
	   }
   }
?>

 

(2)不同文件名

          1:不同文件名的数据结构

<body>
    <form method="post" enctype="multipart/form-data" action="xyy.php">
        <input type="file" name="image1" />
        <input type="file" name="image2" />
        <input type="file" name="image3" />

        <input type="submit" name="btn" value="提交" />
    </form>
</body>
<?php
   header('content-type:text/html;charset=utf-8');
   echo '<pre>';
   print_r($_FILES);
?>

 批量上传:不同名表单每个文件都会形成一个属于自己独立的5个元素的数组

            2:不同文件名的处理方式

<?php
   header('content-type:text/html;charset=utf-8');
   foreach($_FILES as $file){
       //使用foreach遍历
	   //$file相当于是每一个文件信息
	   //开始找到临时路径存放位置
	   if(is_uploaded_file($file['tmp_name'])){
		   move_uploaded_file($file['tmp_name'],'upload/'.$file['name']);
	   }
   }
?>

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

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

相关文章

YOLO v6:一个硬件友好的目标检测算法

本文来自公众号“AI大道理” YOLOv6 是美团视觉智能部研发的一款目标检测框架&#xff0c;致力于工业应用。 YOLOv6支持模型训练、推理及多平台部署等全链条的工业应用需求&#xff0c;并在网络结构、训练策略等算法层面进行了多项改进和优化&#xff0c;在 COCO 数据集上&…

一文轻松明白 Base64 编码原理

把图片丢进浏览器&#xff0c;打开sources能看到一长串字符串&#xff0c;这是图片的Base64编码。这一长串编码到底是怎么生成的呢&#xff1f; 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编码要求把3个8位的字节&#xff08;3824&#xff09;转化为4个6…

C++代码编程学习(2):类和对象封装部分的两个案例-立方体与点圆位置

C类与对象 封装的学习 挺有趣的&#xff01; 一、前言 昨日有点事忙了些&#xff0c;今天把昨天学习的两个案例给整理一下&#xff0c;C确实比较原始基础&#xff0c;在学习过程中需要好好总结分析与记录。 二、效果展示 案例一&#xff1a;设计立方体 立方体的面积和体积 用…

阿里微服务质量保障系列(一):微服务知多少

年初买了一本集团巨佬联合出的书《阿里测试之道》&#xff0c;然后认真拜读了下&#xff0c;我相信看过的同学都会获益匪浅&#xff0c;此书分享了阿里在大促保障、移动App测试、大数据测试、AI系统测试、云计算测试、资损防控、物流类测试等领域的方法、技术和工具平台&#x…

十一、Properties、多线程

Properties集合 Properties作为Map集合的使用 介绍 是一个Map体系的集合类Properties可以保存到流中或从流中加载属性列表中的每个键及其对应的值都是一个字符串 基本使用 public static void main(String[] args) {Properties prop new Properties();//增prop.put("…

Pytorch c++ 部署报错解决方案

目录 1. Only the versions between 2017 and 2019 (inclusive) are supported! 2. Cannot find cuDNN library. Turning the option off C 部署的时候&#xff0c;demo 写完之后&#xff0c;提示如下错误 1. Only the versions between 2017 and 2019 (inclusive) are sup…

使用Kubernetes部署xxl-job-admin及xxl-job执行器服务

部署环境 xxl-job-2.4.0kubernetes-1.26 这里以xxl-job官方的2.4.0的代码为例子&#xff0c;在官方编写的Dockerfile基础上使用dockerkubernetes进行部署&#xff0c;xxl-job-admin和执行器的Dockerfile、application等配置文件并不是关键&#xff0c;所以这里示例安装以官方…

Linux系统初始化进程及文件(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.系统初始化进程及文件 1.init 进程 2.Systemd概述 3.SysVi…

【Java语言】— 循环结构 :for循环

循环结构&#xff1a;for循环 1.for循环 控制一段代码反复执行很多次。 for循环的格式如下&#xff1a; for (初始化语句;循环条件;迭代语句){循环体语句(重复执行的代码);}下面我们通过案例&#xff1a;输出3次HelloWorld感受一下。 //需求&#xff1a;输出3次HelloWorld…

OpenOCD 不同仿真器使用操作总结记录

针对不同的仿真器使用 OpenOCD 时候的设置操作总结 ...... 矜辰所致目录前言一、OpenOCD 环境搭建二、OpenOCD 基本测试三、Makefile 中仿真器配置3.1 ST-link3.2 Jlink3.2 CMSIS-DAP&#xff08;待更新&#xff09;结语前言 在使用 GCC 环境开发 ARM 系列芯片的时候&#x…

ArcGIS基础实验操作100例--实验35等高线生成DEM

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验35 等高线生成DEM 目录 一、实验背景 二、实验数据 三、实验步骤 方法一 &#xff…

4.5、静态路由配置及其可能产生的路由环路问题

静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表\color{red}人工配置路由表人工配置路由表。 这种人工配置方式简单、开销小。但不能及时适应网络状态&#xff08;流量、拓扑等&#xff09;的变化。\color{red}但不能及时适应网络状态&#xff08…

我的世界Bukkit服务器插件开发教程(十三)资源包与玩家资料

十三、资源包与玩家资料 1.资源包&#xff08;Resource Pack&#xff09; 早期的 Minecraft 并没有资源包一说&#xff0c;而是被叫做材质包。有些服务器为了让玩家拥有更好的游戏体验&#xff0c;一般会在自己特制的客户端中存放一些资源包供玩家加载。 显然&#xff0c;使用…

自动梯度计算

神经网络的参数主要通过梯度下降来进行优化&#xff0e; 当确定了风险函数以及网络结构后&#xff0c; 我们就可以手动用链式法则来计算风险函数对每个参数的梯度&#xff0c; 并用代码进行实现&#xff0e; 但是手动求导并转换为计算机程序的过程非常琐碎并容易出错&#xff0…

二叉树的基础oj题(单值二叉树、相同的树、对称二叉树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的构建和遍历、翻转二叉树)

今天&#xff0c;我带来二叉树的基础oj题 目录单值二叉树&#xff1a;[链接](https://leetcode.cn/problems/univalued-binary-tree/)相同的树&#xff1a;[链接](https://leetcode.cn/problems/same-tree/)对称二叉树&#xff1a;[链接](https://leetcode.cn/problems/symmetr…

syzkaller 黑盒测试1:环境搭建

syzkaller 黑盒测试1&#xff1a;环境搭建 近期需要使用syzkaller对某Linux发行版系统内核进行测试&#xff0c;但是未提供内核源码&#xff0c;只能在黑盒条件下测试。这是笔者第一次接触syzkaller&#xff0c;对测试流程不太熟悉。另外&#xff0c;网上很少有syzkaller黑盒测…

C语言版扫雷——从0到1实现扫雷小游戏

&#x1f412;博客名&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;有志者&#xff0c;事竟成&#xff0c;破釜沉舟&#xff0c;百二秦关终属楚&#xff1b;苦心人&#xff0c;天不负&#xff0c;卧薪尝胆&#xff0c;三千越甲可吞吴。 扫雷思维导图 目录 扫雷思维…

9_2、Java基本语法之常用类日期、时间类的使用

一、JDK 8之前时间日期API jdk8之前的日期时间类 1.System的currentTimeMillis() 2.java.util.Date以及子类java.sql.Date 3.SimpleDateFormat 4.Calender类&#xff1a;日历类 1、获取系统当前时间&#xff1a;System类下的currentTimeMillis(); //返回的是当前时间与1970年…

MySQL--整合Keepalived进行双机热备自动切换(升级版)

原文网址&#xff1a;MySQL--整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL整合Keepalived进行双机热备自动切换&#xff08;升级版&#xff09;。 服务器要考虑高可用问题。nginx、tomcat、缓存、队列、数…

Java开发的古董拍卖系统竞标系统拍卖网

简介 古董展品拍卖网站 用户可以注册成为买家也可以申请开店成为卖家&#xff0c;发布古董展品&#xff0c;设置拍卖起止时间进行展品的拍卖。如果早于拍卖开始时间或者晚于拍卖结束时间&#xff0c;则不可以竞拍。多人竞拍&#xff0c;买家可以根据最高价设置谁中标&#xff…