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编程最快明白》第三讲:php数组
Nov 01 PHP
header中Content-Disposition的作用与使用方法
Jun 13 PHP
PHP YII框架开发小技巧之模型(models)中rules自定义验证规则
Nov 16 PHP
详解PHP执行定时任务的实现思路
Dec 21 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
php redis实现对200w用户的即时推送
Mar 04 PHP
PHP编程获取音频文件时长的方法【基于getid3类】
Apr 20 PHP
PHP完全二叉树定义与实现方法示例
Oct 09 PHP
PHP7匿名类的用法示例
Apr 05 PHP
php扩展开发入门demo示例
Sep 23 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
php的无刷新操作实现方法分析
Feb 28 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+MySql编写聊天室
2006/10/09 PHP
php 调用远程url的六种方法小结
2009/11/02 PHP
PHP中isset()和unset()函数的用法小结
2014/03/11 PHP
CI使用Tank Auth转移数据库导致密码用户错误的解决办法
2014/06/12 PHP
PHP中if和or运行效率对比
2014/12/12 PHP
php的4种常用运行方式详解
2016/12/22 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法
2017/11/10 PHP
PHP实现时间日期友好显示实现代码
2019/09/08 PHP
jQuery的一些注意
2006/12/06 Javascript
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
javascript 进阶篇1 正则表达式,cookie管理,userData
2012/03/14 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
VUE : vue-cli中去掉路由中的井号#操作
2020/09/04 Javascript
[14:25]教你分分钟做大人:主宰(HEROS)
2014/12/08 DOTA
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
美国健康和保健平台:healtop
2020/07/02 全球购物
大二学期个人自我评价
2014/01/13 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
三八妇女节活动总结
2014/05/04 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
工程质量保证书
2015/05/09 职场文书
python3 实现mysql数据库连接池的示例代码
2021/04/17 Python
浅谈mysql哪些情况会导致索引失效
2021/11/20 MySQL
Nebula Graph解决风控业务实践
2022/03/31 MySQL