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 程式大小
Dec 06 PHP
php的一个登录的类 [推荐]
Mar 16 PHP
apache php模块整合操作指南
Nov 16 PHP
php常用ODBC函数集(详细)
Jun 24 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
PHP实现指定字段的多维数组排序函数分享
Mar 09 PHP
php备份数据库类分享
Apr 14 PHP
PHP输入输出流学习笔记
May 12 PHP
php 反斜杠处理函数addslashes()和stripslashes()实例详解
Dec 25 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
Laravel 自带的Auth验证登录方法
Sep 30 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
新52大事件
2020/03/03 欧美动漫
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
来自国外的页面JavaScript文件优化
2010/12/08 Javascript
禁用页面部分JavaScript方法的具体实现
2013/07/31 Javascript
jQuery.fn和jQuery.prototype区别介绍
2013/10/05 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
JS实现的简单分页功能示例
2018/08/23 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
[02:39]DOTA2国际邀请赛助威团西雅图第一天
2013/08/08 DOTA
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python+selenium+autoit实现文件上传功能
2017/08/23 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
2018/04/17 Python
Python实现中一次读取多个值的方法
2018/04/22 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
幼儿园大班教学反思
2014/02/10 职场文书
文秘应聘自荐书范文
2014/02/18 职场文书
幼儿园大班评语大全
2014/04/17 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
《狼王梦》读后感:可怜天下父母心
2019/11/01 职场文书
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js