php 快速入门(五)

一、文件上传

文件上传的基础知识:

  1. 首先,在客户端form表达设置,选择上传的文件
  2. 然后,在服务器对上传文件进行操作处理

1.1 关于前台页面

必须设置 form 表单项:

<html><head><title>文件上传</title></head><body><from action="./upload.php" method="post" enctype="multipart/form-data">选择文件: <input type="file" name="myfile"><input type="submit" value="上传文件"></from></body>
</html>

注意事项

  1. 一定是post方式上传文件,不可用get方式。
  2. form 表单中一定要些enctype="multipart/form-data"。
  3. input 表单一定要写name,后端的php是基于name来接收上传的文件的。

1.2 后端的php程序

1. 通过PHP脚本来处理的,具体需要通过以下三个方面信息

2. 后端的PHP文件,是基于一个数组来接收传入的文件的,这个数组是一个内置数组【二维数组】:

$_FILES

数组的索引值

注意: html的input标签的name的值是myfile$_FILES["myfile"]["error"]: 记录文件上传过程中,是否发生了错误,如果这里的值大于0,那么就发生了错误:否则上传成功
$_FILES["myfile"]["name"]: 上传的文件名称
$_FILES["myfile"]["tmp_name"]: 文件被上传到服务器后,文件在服务器上的文件名
$_FILES["myfile"]["type"]: 上传文件的文件类型
$_FILES["myfile"]["size"]: 上传文件的大小,默认单位是字节

1.3 php的文件上传处理函数

上传成功的文件会被放置到服务器端临时目录下,文件名是随机生成的临时文件名。

注:该文件在程序执行完后将自动删除掉。在删除前可以像本地文件一样操作。

文件上传处理函数:

is_uploaded_file - 判断文件是否通过 HTTP POST 上传的。
格式:is_uploaded_file (strint $filename)
返回结果:布尔值move_uploaded_file - 将上传的文件移动到新位置
格式:move_uploaded_file (string $filename,strint $destination)
返回结果:布尔值
注意1:第二个参数不能是目录,而应该是目录下的某个文件,例如 ./dir1/abcd.html
注意2:上传的文件名中如果有中文的话,默认会导致移动失败,解决方法是用iconv将文件编码修改为gbk。
注意3:如果目标文件已经存在,将会被覆盖。         

案例:

前台页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><from action="./upload.php" method="post" enctype="multipart/form-data">//必须要写选择文件:<input type="file" name="myfile"><input type="submit" value="上传文件></from>
</body>
</html>

后台程序

<?phpheader("Content-type:text/html;charset=utf-8");// myfile 是前台的html页面中的name属性的值// $_FILES['myfile']['error'] 数组可以判断是否上传成功if ($_FILES['myfile']['error'] > 0){echo "上传发生错误".$_FILES['myfile']['error']."<br>";}else{echo "文件上传成功<br>";echo "文件名称:".$_FILES['myfile']['name']."<br>";echo "文件类型:".$_FILES['myfile']['type']."<br>";echo "文件大小:".$_FILES['myfile']['size']."<br>";echo "文件临时存储位置:".$_FILES['myfile']['tmp_name']."<br>";# $_FILES['myfile']['name'] 保存的文件名,但是文件名如果有中文,会导致失败# 用 iconv 将文件名编码修改为gbk# 最终用 $fileName 保存修改编码后的文件名$fileName = iconv("UTF-8","GBK",$_FILES['myfile']['name']);// 将临时存储的文件移动到当前位置下的abcd目录中// 移动过去后将文件名修改为原始名字$res = move_uploaded_file($_FILES['myfile']['tmp_name'],"./abcd/".$fileName);if($res){// 最后在页面上需要显示文件名,所以需要将编码从gbk修改回utf-8$fileName = iconv("GBK","UTF-8",$fileName);echo "文件成功移动到./abcd/".$fileName;}else{echo "文件移动失败";}} 
?>

1.4 扩展内容

PHP 配置文件中与文件上传有关的选项

指令名默认值功能描述
file_uploadsON是否开启文件上传
upload_max_filesize2M限制PHP处理上传文件的最大值,此值必须小于post_max_size
post_max_size8M限制通过POST方法可以接收信息的最大值,也就是整个POST请求的提交值。此值必须大于 upload_max_filesize
upload_tmp_dirNULL上传文件存放的临时路径,可以是绝对路径。默认NULL 则使用系统的临时目录。
max_file_uploads20文件允许同时上传的个数

关于 error 文件上传的错误代码:

UPLOAD_ERR_OK: 其值为0,没有错误发生,文件上传成功。
UPLOAD_ERR_INI_SIZE: 其值为1,上传的文件超过了php.ini中 upload_max_filesize 选项限制的值。
UPLOAD_ERR_FORM_SIZE: 其值为2,上传文件的大小超过了HTML表单中MAX_FILE_SIZE 选项指定的值。
UPLOAD_ERR_PARTIAL: 其值为3,文件只有部分被上传。
UPLOAD_ERR_NO_FILE: 其值为4,没有文件被上传。
UPLOAD_ERR_NO_TMP_DIR: 其值为6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进
UPLOAD_ERR_CANT_WRITE: 其值为7,文件写入失败。PHP 5.1.0 引进

常见数据格式(MIME)

文件类型MIME 类型
图片文件image/gif,image/jpg,image/jpeg,image/png,image/x-png
纯文本和HTMLtext/txt,text/plan,text/html
二进制文件application/octet-stream
音频格式audio/basic
视频格式video/mpeg

案例:

1、设置前端上传界面

<from action="upload.php" method="post" enctype="multipart/form-data"><input type="file" name="myfile"><input type="submit" value="上传">
</from>

2、upload.php 处理上传到临时目录的文件
 

<?php    header("Content-type:text/html;charset=utf-8");if ($_FILES['myfile']['error']>0){echo "上传发生错误".$_FILES['myfile']['error']."<br>";}else{echo "文件名称:".$_FILES['myfile']['name']."<br>";echo "文件类型:".$_FILES['myfile']['type']."<br>";echo "文件大小:".($_FILES['myfile']['size']/1024)."KB<br>";echo "文件临时存储位置:".$_FILES['myfile']['tmp_name']."<br>";}
?>====================================================================================<?phpif ($_SERVER["REQUEST_METHOD"] == "POST") {$file = $_FILES["file"];// 检查文件是否上传成功if ($file["error"] == UPLOAD_ERR_OK) {$uploadPath = "uploads/".$file["name"];//将临时文件移动到目标路径if (move_uploaded_file($file["tmp_name"],$uploadPath)) {echo "文件上传成功!";} else {echo "文件上传失败!";}} else {echo "文件上传出错:".$file["error"]'}}
?>

封装成函数:

思路

function upload(){//1.判读文件是否上传错误//2.判断文件上传的类型是否是你想要的类型//3.起名字//4.判断保存路径是否存在//5.判断是否是http post方式上传//6.移动图片//7.返回移动成功的图片名
}

开始封装函数:新建 function php

<?php
/*文件上传函数@param string $name     文件上传域的name值@param strint $dir      文件保存路径@param array  $allow    文件允许上传的类型return string $filename 文件名 如果失败 返回false
*/function upload($name,$dir='./upload/',$allow=array('jpg','gif','jpeg','png')){// 1.判断文件上传错误if($_FILES[$name]['error']>0){switch($_FILES[$name]['error']){case 1:echo '上传的文件超过了 php.ini 中upload_max_filesize 选项限制的值';break;case 2:echo '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值';break;case 3:echo "文件只有部分被上传";break;case 4:echo '没有文件被上传';break;case 6:echo '找不到临时文件夹';break;case 7:echo '文件写入失败';break;}return false;}// 2.判断文件上传的类型是否是你想要的类型// 2.1允许上传的类型// 2.2获取后缀名$suffix = pathinfo($_FILES[$name]['name'],PATHINFO_EXTENSION);// 2.3 判断是否是我们允许上传的类型if (!in_array($suffix,$allow)){//不允许上传的类型echo '大哥你的上传类型不符合';return false;}// 3.起名字$filename = date('Ymd').uniqid().mt_rand(0,9999).'.'.$suffix;// 4.判断保存路径是否存在// 4.1 得到保存路径// 4.2 处理保存路径和否面的斜杠$save_path = rtrim($dir,'/');$save_path .= '/';// 4.3 保存路径中的时间文件夹处理$save_path .= date('Y/m/d/');// 4.4 判断保存的路径是否存在if (!file_exists($save_path)){mkdir($save_path,777,true);}// 4.5 拼接一个完整的保存路径$path = $save_path.$filename// 5.判断是否是httppost方式上传if (!is_uploaded_file($_FILES[$name]['tmp_name'],$path)){echo '移动失败';return false;}// 7.返回移动成功的文件名return $filename;
}?>

调用函数开始上传:

<?phpinclude './function.php';echo upload('file','./leiding',array('jpg','png'));

参考版本

<?php//第一步:明确服务器规定上传至服务器的文件类型。这里我们只允许上传以下类型的图片。$allowedExts = array("git","jpeg","jpg","png");// 允许上传的图片后缀//第二步:获取上传的文件名称,通过explorde()函数将其分割成字符串形式的数组。$temp = explode(".",$_FILES['myfile']['name']);echo $_FILE['myfile']['size'];$extension = end($temp);    //end函数用于获取数组中最后一个元素的值。//第三步:列出上传文件需要满足的if ((($_FILES['myfile']['type'] == 'image/gif')|| ($_FILES['myfile']['type'] == 'image/jpeg')|| ($_FILES['myfile']['type'] == 'image/jpg')|| ($_FILES['myfile']['type'] == 'image/pjpeg')|| ($_FILES['myfile']['type'] == 'image/x-png')|| ($_FILES['myfile']['type'] == 'image/png'))&& ($_FILES['myfile']['size'] < 204800 ) // 小于 200 kb&& in_array($extension,$alloweExts))  //in_array表示在$allowedExts数组中查找$extension这个字符串{if ($_FILES["myfile"]["error"] > 0){echo "错误::".$_FILES["myfile"]["error"]."<br>";} else {echo "上传文件名:".$_FILES["myfile"]["name"]."<br>";echo "文件类型:".$_FILES['myfile']['type']."<br>";echo "文件大小:".($_FILES['myfile']['size'] / 1024)."<br>";echo "文件临时存储位置:".$_FILES['myfile']['tmp_name']."<br>";// 判断当前目录(即www文件夹中)下的upload目录(自己创建,名字自取)是否存在该文件// 如果没有upload目录,你需要创建它,upload目录权限为777if (file_exists("upload/".$_FILES['myfile']['name'])){echo $_FILES['myfile']['name'].'文件已经存在。';} else {//如果upload目录不存在该文件则将文件上传到upload目录下move_upload_file($_FILES['myfile']['tmp_name'],"upload/".$_FILES['myfile']['name']);echo "文件存储在:"."upload/".$_FILES['myfile']['name'];}}} else {echo "非法的文件格式";}
?>

多文件上传

不同 name 名称多文件上传

当需要上传多个文件,有两种解决方法:

1、使用不同的表单元素

<input type="file" name="file_a">
<input type="file" name="file_b">
<input type="file" name="file_c">

2、使用数组格式的表单元素

<input type="file" name="file[]">
<input type="file" name="file[]">
<input type="file" name="file[]">

二、 文件下载

2.1 对于浏览器不识别的文件,可以直接利用a链接下载

<!-- 因为他们三个浏览器不认识这样的类型 -->
<a href="./downlist/1.rar">1.rar</a>
<a href="./downlist/1.exe">1.exe</a>
<a href="./downlist/1.avi">1.avi</a>

2.2 对于浏览器不识别的,可以利用readfile函数

<!-- 浏览器人事这样的类型就会被解析 --><a href="./action.php?name=1.html">1.html</a><a href="./action.php?name=1.php">1.php</a><a href="./action.php?name=1.txt">1.txt</a><a href="./action.php?name=1.jpg">1.jpg</a>//接收一下name值
$name = $_GET['name'];//实现下载功能,强制浏览器弹出另存为对话框
header('content-Disposition:attachment;filename="'.$name.'"');
//此时只是下载了一个空文件,需要利用readfile读一遍所有的内容,便可下载。
$path = './downlist/'.$name;
readfile($path);

2.3 案例:

1、创建一个文件下载链接

首先,我们需要创建一个文件下载链接来让用户下载文件。假设我们已经有一个文件保存在uploads目录下,并命名为test.pdf。我们可以通过以下代码创建一个下载链接:

<a href="download.php?file=test.pdf">下载文件</a>

2、创建一个文件下载处理脚本

然后,我们需要创建一个名为 download.php 的PHP脚本来处理文件下载。创建一个具有以下代码的文件:

<?php$fileDir = "uploads/";    //文件保存的目录if (isset($_GET['file'])) {$filePath = $fileDir.$_GET['file'];    //文件的完整路径if (file_exists($filePath)) {header("Content-Type:application/octet-stream");header("Content-Disposition:attachment;filename=".basename($filePath));header("Content-Length:".filesize($filePath));    readfile($filePath);} else {echo "文件不存在";}}
?>

以上代码首先指定了文件保存的目录,即uploads目录。在处理文件下载是,我们设置了一些响应头信息,如Content-Type、Content-Disposition-Length,然后使用 readfile 函数将文件内容输出到浏览器

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

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

相关文章

Python+Pytest+Allure搭建接口自动化测试框架

最近在用PythonPytestAllure搭建接口自动化测试框架 具体的框架要求&#xff1a; 1&#xff0c;使用Pytest进行测试用例编写和执行 2&#xff0c;使用Allure生成漂亮的测试报告 3&#xff0c;并且要求有断言方法 初步的框架设计如下&#xff0c;后期可以进一步添加很多功能…

Consul集群搭建看这篇就够了(consul cluster configuration )

Consul 是一种用于服务发现、配置和分布式一致性的开源工具和平台。它由 HashiCorp 公司开发和维护&#xff0c;旨在简化构建和维护分布式系统的任务。 Consul 提供了许多功能&#xff0c;包括&#xff1a; 服务发现&#xff1a;Consul允许服务注册和发现。当服务启动时&#…

《35岁,程序员的危机or转机?——深度剖析程序员职业发展之路》

一、引言 35岁,对于很多程序员来说是一个让人焦虑的年龄。在互联网行业,35岁往往被视为职业生涯的分水岭。许多程序员开始担心,随着年龄的增长,他们的职业发展是否会受到限制。这种担忧并非毫无根据。互联网行业瞬息万变,新技术层出不穷,对程序员的学习能力和适应能力提出了很高…

达梦查询text转换问题

bug&#xff1a;表字段为TEXT&#xff0c;数据返回页面时&#xff0c;打断点查看其为NClobProxyImpl对象 org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/quality].[dispatcherServlet] -Servlet.service() for servlet [dispatcherServlet] in context with …

【 C++ 】如何查看项目中使用的c++版本

如何查看项目中使用的c版本 std::cout << __cplusplus << std::endl;在项目任一位置&#xff0c;创建.cpp文件&#xff08; C/C Source.File&#xff09; main.cpp #include <iostream>int main() {std::cout << "Hello World!\n";std::co…

C++流插入、提取重载详解

内置类型支持流插入 自定义类型不支持流插入 注意&#xff1a;运算符重载如果有两个操作数的时候&#xff0c;第一个为左操作数&#xff0c;第二个为右操作数 而成员函数的第一个参数默认为this基类&#xff0c;而this参数又不能显式书写&#xff0c;所以没法改 也就是说第一个…

JAVA-----

标识符 标识符可以简单的理解为一个名字&#xff0c;在Java中&#xff0c;我们需要给代码中的很多元素起名字&#xff0c;包括类名、方法名、字段名、变量名等等。我们给对应元素起的名称就被叫做是标识符。一个正确的标识符需要遵循以下规则&#xff1a; 1.标识符可以由字母、…

PYTHON初级笔记1

0、python&#xff1f; 简单的编程语言 python环境搭建&#xff1a; ①、开发环境&#xff1a;vscode、sublime、pycharm...... ②、运行环境&#xff1a;cpython解释器 python如何写代码&#xff1f; ①、在终端上的命令行上写&#xff0c;可以是我们cmd的中终端&#xff0c;…

MATLAB 公共区域的点云合并(46)

MATLAB 公共区域的点云合并(46) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 点云配准后,或者公共区域存在多片点云对场景进行冗余过量表达时,我们需要将点云进行合并,Matlab点云工具中提供了这样的合并函数,通过指定网格步长,对初始点云进行过滤。 函数主要实…

分治——快速排序算法

例题一 解法&#xff08;快排思想 - 三指针法使数组分三块&#xff09;&#xff1a; 算法思路&#xff1a; 类⽐数组分两块的算法思想&#xff0c;这⾥是将数组分成三块&#xff0c;那么我们可以再添加⼀个指针&#xff0c;实现数组分 三块。 设数组⼤⼩为 n &#xff0c…

非计算机科班如何丝滑转码:规划、前景与行动建议

近年来&#xff0c;计算机领域因其广阔的应用前景和优厚的薪资待遇&#xff0c;吸引了众多非计算机科班出身的人士想要转行。然而&#xff0c;对于没有专业背景的他们来说&#xff0c;如何实现从其他行业到计算机领域的丝滑转码&#xff0c;确实是一个值得深思的问题。以下是我…

nextjs getServerSideProps 获取url中的参数

在 Next.js 中&#xff0c;可以使用 getServerSideProps 函数的上下文对象来获取 URL 中的参数。getServerSideProps 函数接收一个上下文对象&#xff08;通常命名为 context&#xff09;&#xff0c;其中包含了有关请求的信息&#xff0c;包括查询参数、路径参数等。 以下是一…

数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;数据分析系统化教学&#xff0c;零基础到进阶实战 景天的主页&#xff1a;景天科技苑 文章目录 Streamlit什么是streamli…

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…

毫米波雷达简介

毫米波雷达简介 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1. 概述 1.1 发展历史 RADAR是RAdio Detection And Ranging的缩写。 1936年1月&#xff0c;英国架起了第一个雷达站&#xff0c;用于监测德国战机。从此之后&#xff0c;雷达技术开始蓬勃发展。 雷达的频段很…

软件测试基础(1)

软件测试的生命周期 软件测试的生命周期: 需求分析 -> 测试计划 -> 测试设计, 测试开发 -> 测试执行 -> 测试评估. 软件测试 & 软件开发的生命周期 1.需求阶段 测试人员了解需求, 对需求进行分解, 得出测试需求. 2.计划阶段 根据需求编写测试计划/测试方案 3…

Web核心

目录 Web核心HTTP概念&#xff1a;协议特点&#xff1a;请求数据格式响应数据格式 Tomcat简介基本使用配置部署项目IDEA中创建 Maven Web 项目 IDEA使用Tomcat Servlet简介快速入门执行流程生命周期体系结构Servlet urlPattern配置一个Servlet&#xff0c;可以配置多个 urlPatt…

Java函数式编程-Stream流

Java函数式编程-Stream流 1.概述为什么学&#xff1f;函数式编程思想优点 2.Lambda表达式2.1概述2.2核心原则2.3 基本格式例一例二 2.4省略规则 3.Stream流概述3.2案例数据准备3.3快速入门3.3.1需求3.3.2实现 3.4常用操作3.4.1创建流3.4.2中间操作filtermapdistinctsortedlimit…

java-springboot实现图片的上传

我们在resources目录下创建image目录来存放上传的图片 service层懒的写&#xff0c;就都写controller层了。 RestController RequestMapping("/upload") public class upload {PostMapping("/pic")public String upLoad(RequestParam("multipartFile…

PTA金字塔游戏

幼儿园里真热闹&#xff0c;老师带着孩子们做一个名叫金字塔的游戏&#xff0c;游戏规则如下&#xff1a; 首先&#xff0c;老师把孩子们按身高从高到矮排列&#xff0c;选出最高的做队长&#xff0c;当金字塔的塔顶&#xff0c;之后在其余小朋友里选出两个最高的&#xff0c;…