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和ACCESS写聊天室(七)
Oct 09 PHP
修改了一个很不错的php验证码(支持中文)
Feb 14 PHP
php设计模式 Singleton(单例模式)
Jun 26 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
PHP中的str_repeat函数在JavaScript中的实现
Sep 16 PHP
php循环创建目录示例分享(php创建多级目录)
Mar 04 PHP
php合并数组中相同元素的方法
Nov 13 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
Apr 03 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
PHP Ajax实现无刷新附件上传
Aug 17 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
PHP如何解决微信文章图片防盗链
Dec 09 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
PHP.MVC的模板标签系统(三)
2006/09/05 PHP
BBS(php &amp; mysql)完整版(一)
2006/10/09 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
Jquery中dialog属性小记
2010/09/03 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
JavaScript中的条件判断语句使用详解
2015/06/03 Javascript
javascript如何写热点图
2015/12/08 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
Python处理XML格式数据的方法详解
2017/03/21 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python中安装easy_install的方法
2018/11/18 Python
Scrapy框架实现的登录网站操作示例
2020/02/06 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Python如何省略括号方法详解
2020/03/21 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
用python制作个音乐下载器
2021/01/30 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
医药销售求职信范文
2014/02/01 职场文书
致800米运动员广播稿
2014/02/16 职场文书
党支部特色活动方案
2014/08/20 职场文书
2015年小学开学寄语
2015/02/27 职场文书
学习党史心得体会2016
2016/01/23 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
如何书写授权委托书?
2019/06/25 职场文书
HTML中实现音乐或视频自动播放案例详解
2022/05/30 HTML / CSS