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 删除记录实现代码
Mar 12 PHP
字母顺序颠倒而单词顺序不变的php代码
Aug 08 PHP
php与paypal整合方法
Nov 28 PHP
php GeoIP的使用教程
Mar 09 PHP
php fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
May 24 PHP
PHP自定义大小验证码的方法详解
Jun 07 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
Jun 18 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
Jun 28 PHP
Yii2创建控制器(createController)方法详解
Jul 23 PHP
php unicode编码和字符串互转的方法
Aug 12 PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 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 ajax 静态分页过程形式
2011/09/02 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php Session无效分析资料整理
2016/11/29 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
用JavaScript调用WebService的示例
2008/04/07 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
2013/07/07 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jquery实现类似EasyUI的页面布局可改变左右的宽度
2020/09/12 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
2017/12/28 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
简单介绍Python中的len()函数的使用
2015/04/07 Python
Python导入oracle数据的方法
2015/07/10 Python
Python中数字以及算数运算符的相关使用
2015/10/12 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
基于Python实现用户管理系统
2019/02/26 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
python中np是做什么的
2020/07/21 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
初中班干部工作总结
2015/08/10 职场文书
七年级思品教学反思
2016/02/20 职场文书
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB