php文件上传原理与实现方法详解


Posted in PHP onDecember 20, 2019

本文实例讲述了php文件上传原理与实现方法。分享给大家供大家参考,具体如下:

文件上传实际上就是在前段使用一个form表单提交本地文件到服务器,然后在服务器端将文件从临时目录转移到指定目录的过程。

1、php配置文件

php.ini文件中的file uploads部分定义了相关文件上传配置,

  • file_uploads = On 打开文件上传
  • upload_tmp_dir =临时目录
  • upload_max_filesize = 2M最大上传大小
  • max_file_uploads = 20单次最大上传文件数

2、前端表单

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

当使用由文件上传控件的表单时,必须将form的enctype设置为"multipart/form-data"。

可以在客户端对上传文件的大小与类型进行限制:

<input type="hidden" name="MAX_FILE_SIZE" value="8096">
<input type="file" name="myfile" accept="image/jpeg,image/png">

3、后台处理

上传后会在服务器端得到一个$_FILES文件数组如下:

php文件上传原理与实现方法详解

上传到服务器的临时文件默认保存在php.ini中upload_tmp_dir所设置的目录下,我们需要将文件移动到指定位置:

<?php
  header('Content-type:text/html;charset=utf-8');
  $myfile=$_FILES['myfile'];
  //获取文件数组['myfile']的属性tmp_name与name
  $tmp=$myfile['tmp_name'];
  $picname=$myfile['name'];
  //windows采用GBK编码,php采用utf-8编码,需要改变文件名的编码格式
  $picname=iconv('utf-8','GBK',$picname);
  //将零时文件$tmp移动到指定目录userpic并命名为$picname
  copy($tmp,"userpic/".$picname);

file_uploads=On 开启HTTP上传
upload_tmp_dir 临时文件保存目录
upload_max_filesize=2M 最大上传文件大小
post_max_size=8M POST方式传输最大数据值
max_file_uploads 一次上传最大文件数
memory_limit=128M 单线程最大内存占用量
max_excution_time=-1 脚本解析所允许的最大执行时间(s),默认为-1未开启

4、错误处理

对file数组中的error属性进行判断处理:

$error=$myfile['myfile']['error'];
  if ($error==0){//为0,代表上传成功
    if (move_uploaded_file($tmp,"userpic/".$picname)) {
      echo "移动文件成功";
    }else{
      echo "移动文件失败";
    }
  }else{//不为0,匹配错误信息
    switch ($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 7://文件写入失败
      case 8:
        echo "系统错误";
        break;
    }
  }

5、上传限制

在前端可以对上传的文件类型,大小进行限制:

<!--表单隐藏域对上传大小进行限制-->
<input type="hidden" name="MAX_FILE_SIZE" value="2097152">
<!--accept 对文件类型限制-->
<input type="file" name="myfile" accept="image/jpeg,image/png">

注意限制是以字节为单位

在服务器端也要做响应的限制:

$size=$myfile['size'];//获取文件大小
$MaxSize=2097152;//设置最大允许字节
$type=$myfile['type'];//获取图片类型
$AllowTypr=array('image/jpeg','image/png','image/gif');//允许类型数组
if ($error==0){//为0,代表上传成功
  if ($size>$MaxSize){
    echo "<script>alert('文件大小超过限制');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }
  if (!in_array($type,$AllowTypr)){
    echo "<script>alert('请上传正确图片类型');</script>";
    echo "<script>history.back(1);</script>";
    exit();
  }

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP动态创建Flash动画
Oct 09 PHP
比较全的PHP 会话(session 时间设定)使用入门代码
Jun 05 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
thinkphp浏览历史功能实现方法
Oct 29 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
PHP实现的权重算法示例【可用于游戏根据权限来随机物品】
Feb 15 PHP
tp5框架的增删改查操作示例
Oct 31 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 PHP
PHP单元测试配置与使用方法详解
Dec 27 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 #PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 #PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 #PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 #PHP
Laravel框架处理用户的请求操作详解
Dec 20 #PHP
PHP上传图片到数据库并显示的实例代码
Dec 20 #PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 #PHP
You might like
预告映像公开!第1章续篇剧场版动画《Princess Principal Crown Handler》4月10日上映!
2020/03/06 日漫
IIS6的PHP最佳配置方法
2007/03/19 PHP
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP处理postfix邮件内容的方法
2015/06/16 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
php-app开发接口加密详解
2018/04/18 PHP
php数组和链表的区别总结
2019/09/20 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
2014/10/17 Javascript
javascript计时器详解
2015/02/28 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
使用Python的turtle模块画图的方法
2017/11/15 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
详解python中的time和datetime的常用方法
2019/07/08 Python
keras获得model中某一层的某一个Tensor的输出维度教程
2020/01/24 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
详解tensorflow之过拟合问题实战
2020/11/01 Python
详解canvas drawImage()方法绘制图片不显示的问题
2018/10/08 HTML / CSS
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
汉语专业应届生求职信
2013/10/01 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
浅谈Python列表嵌套字典转化的问题
2021/04/07 Python
golang 在windows中设置环境变量的操作
2021/04/29 Golang
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL