php文件上传 你真的掌握了吗


Posted in PHP onNovember 28, 2016

这里首先声明一下这一章的内容比较多,比较难,你要抱着和自己死磕的态度。细微之处不放过,多敲多练是王道。
学习就像爬山,得一步一步来,首先给自己定一个小目标,然后再坚持不懈地往高出攀爬,最终到达最顶峰。
请仔细斟酌上面两句忠告

一、我的准备情况说明。

编辑器:sublime text3(用什么编辑器看自己爱好)
服务器构建:使用phpstudy2014构建服务器,服务器文件存储在我自身电脑D盘的www文件中。(安装phpstudy会自动生成www文件,安装在哪个盘自己做主)。运行phpstudy,通过在浏览器地址栏输入localhost可以访问服务器中文件。
上传文件的过程:浏览器在客户端上传文件,点击提交,文件被传送给服务器中的某个php文件进行处理,该php对该上传文件保存到服务器。

二、创建表单

请看我的html代码

php文件上传 你真的掌握了吗

enctype

在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。enctype有三种:
1、application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
2、multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。
3、 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。 
补充(随便看看就好):orm的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。

有点难理解。
总归就记住两句话:如果input标签中有type=file,则enctype=multipart/form-data。如果没有type=file一般情况下使用application/x-www-form-urlencoded。
文件上传时都要将数据进行一定转化才能上传到服务器,application/x-www-form-urlencoded和multipart/form-data两者之间的区别就在与转化编码方式不同。

三、创建php文件用于处理上传的文件。

php文件上传 你真的掌握了吗

上传文件后效果如下:

php文件上传 你真的掌握了吗

每一个上传文件都有name、type、size、tmp_name等信息。文件上传后,这些文件相关信息存在FILES这个数组变量。_FILES[“myfile”][“name”]相当于一个多维数组的访问,FILES先获取表单名称为myfile的input上传的文件数据,然后再访问name、type、size、error等数据。_FILES["myfile"]["error"]用来处理文件没有正常上传的情况,例如超过限定上传的文件大小。如果FILES[“myfile”][“error”]=0,表示文件正常上传。_FILES[“myfile”][“error”]>0表示文件没有正常上传。
FILES[“myfile”][“error”]=1上传文件超过服务器限定的值,比如超过服务器空间大小。_FILES[“myfile”][“error”]=2 超过浏览器限定上传的值 $_FILES[“myfile”][“error”]=3文件只有部分被上传

FILES[“myfile”][“error”]=4没有文件本上传。_FILES[“myfile”][“error”]还可以为5、6、7、8,这里不做深究,只需知道其大于0时就意味这文件上传出错即可。

上传限制

通常情况下,服务器通常会限制服务器上传文件的大小或者类型。我们在上面php代码的基础上添加对上传文件代码的限制。
先熟悉几个函数用法:
explode()函数用于分割字符串,例:explode(“.”,”aaa.HTML”)就是在点的位置将这个字符串分成”aaa”和”HTML”两个字符串,这两个字符串按顺序存储在同一个数组中。
end()获取数组中最后一个元素的值。
in_array()在数组中查找某个元素,看是否存在,存在返回为true,不存在返回为false。

<?php
//第一步:明确服务器规定上传至服务器的文件类型。这里我们只允许上传以下类型的图片。
$allowedExts = array("gif", "jpeg", "jpg", "png");// 允许上传的图片后缀
//第二部:获取上传的文件名称,通过explorde()函数将其分割成字符串形式的数组。
$temp = explode(".", $_FILES["myfile"]["name"]);
echo $_FILES["file"]["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, $allowedExts))
  //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) . " kB<br>";
    echo "文件临时存储的位置: " . $_FILES["myfile"]["tmp_name"] . "<br>";
  }
}
else
{
  echo "非法的文件格式";
}
?>

四、保存上传的文件

文件上传后,它是保存在一个临时的位置。脚本结束时它就会消失。如果要把他永久的保存在服务器中,我们要把它保存在另一个位置。
. file_exists(“upload/” . FILES[“file”][“name”])检查文件或目录是否存在。.moveuploadedfile(_FILES["file"]["tmp_name"], "upload/" . $_FILES[“myfile”][“name”]);将上传文件从临时位置转移到服务器空间。

<?php
//第一步:明确服务器规定上传至服务器的文件类型。这里我们只允许上传以下类型的图片。
$allowedExts = array("gif", "jpeg", "jpg", "png");// 允许上传的图片后缀
//第二部:获取上传的文件名称,通过explorde()函数将其分割成字符串形式的数组。
$temp = explode(".", $_FILES["myfile"]["name"]);
echo $_FILES["myfilefile"]["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, $allowedExts))//in_array表示在$allowedExts数组中查找$extension这个字符串
{
  if ($_FILES["myfilefile"]["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>";

    // 判断当期目录(即www文件夹中)下的 upload 目录(自己创建,名字自取)是否存在该文件
    // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
    if (file_exists("upload/" . $_FILES["myfile"]["name"]))
    {
      echo $_FILES["myfile"]["name"] . " 文件已经存在。 ";
    }
    else
    {
      // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
      move_uploaded_file($_FILES["myfile"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);//
      echo "文件存储在: " . "upload/" . $_FILES["myfile"]["name"];
    }
  }
}
else
{
  echo "非法的文件格式";
}
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
强烈推荐:php.ini中文版(2)
Oct 09 PHP
使用网络地址转换实现多服务器负载均衡
Oct 09 PHP
PHP通用检测函数集合
Nov 25 PHP
PHP生成静态页
Nov 25 PHP
PHP define函数的使用说明
Aug 27 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
php 购物车完整实现代码
Jun 05 PHP
PHP将URL转换成短网址的算法分享
Sep 13 PHP
PHP中file_put_contents追加和换行的实现方法
Apr 01 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
laravel中的一些简单实用功能
Nov 03 PHP
php微信公众号js-sdk开发应用
Nov 28 #PHP
php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
Nov 28 #PHP
php微信公众平台交互与接口详解
Nov 28 #PHP
php微信公众号开发模式详解
Nov 28 #PHP
jQuery+php简单实现全选删除的方法
Nov 28 #PHP
PHP中的use关键字及文件的加载详解
Nov 28 #PHP
php连接微软MSSQL(sql server)完全攻略
Nov 27 #PHP
You might like
优化使用mysql存储session的php代码
2008/01/10 PHP
ie6 动态缩略图不显示的原因
2009/06/21 PHP
PHP 数组基础知识小结
2010/08/20 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
JS 巧妙获取剪贴板数据 Excel数据的粘贴
2009/07/09 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
jQuery+PHP+MySQL二级联动下拉菜单实例讲解
2015/10/27 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
js中作用域的实例解析
2017/03/16 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
React Native 截屏组件的示例代码
2017/12/06 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python reduce 函数使用详解
2017/12/05 Python
使用Python+Splinter自动刷新抢12306火车票
2018/01/03 Python
Python单元和文档测试实例详解
2019/04/11 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
大学生怎样进行自我评价
2013/12/07 职场文书
关于旷工的检讨书
2014/02/02 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
教育英语专业毕业生的求职信
2014/03/13 职场文书
自我推荐信范文
2014/05/09 职场文书
主题班会演讲稿
2014/05/22 职场文书
销售团队激励口号
2014/06/06 职场文书
委托书的格式
2014/08/01 职场文书
班主任工作实习计划
2015/01/16 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
认识实习感想
2015/08/10 职场文书
python 爬取华为应用市场评论
2021/05/29 Python