PHP文件上传原理详解(附源码)

栏目: PHP · 发布时间: 8年前

内容简介:PHP文件上传原理详解(附源码)

PHP文件上传原理详解(附源码)

1、文件上传原理

将客户端的文件上传到服务器,再将服务器的临时文件上传到指定目录

2、客户端配置

  • 提交表单
  • 表单的发送方式为post
  • 添加enctype="multipart/form-data"

3、服务器端配置

  • file_uploads = On,支持HTTP上传
  • uoload_tmp_dir = ,临时文件保存目录
  • upload_max_filesize = 2M,允许上传文件的最大值
  • max_file_uploads = 20 ,允许一次上传到的最大文件数
  • post_max_size = 8M,post方式发送数据的最大值
  • max_execution_time = -1,设置了脚本被解析器终止之前允许的最大执行时间,单位为秒,防止程序写的不好而占尽服务器资源。-1代表无穷
  • max_input_time = 60 ,脚本解析输入数据允许的最大时间,单位为秒
  • max_input_nesting_level = 64 ,设置输入变量的嵌套深度
  • max_input_vars_ = 1000,接受多少输入的变量(限制分别应用于$_GET、$_POST和$_COOKIE超全局变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。
  • memory_limit = 128M,最大单线程的独立内存使用量。也就是一个web请求,给予线程最大的内存使用量的定义

4、错误信息说明

  • UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功
  • UPLOAD_ERR_INI_SIZE:其值为1,上传的文件超过了php.ini中upload_max_filesize选项限制的值
  • UPLOAD_ERR_FORM_SIZE:其值为2,上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值
  • UPLOAD_ERR_PARTIAL:其值为3,文件只有部分被上传
  • UPLOAD_ERR_NO_FILE:其值为4,没有文件被上传
  • UPLOAD_ERR_NO_TMP_DIR:其值为6,找不到临时文件夹
  • UPLOAD_ERR_CANT_WRITE:其值为7,文件写入失败
  • UPLOAD_ERR_EXTENSION:其值为8,上传的文件被 PHP 扩展程序中断

5、客户端限制

  • 通过表单隐藏域限制文件上传文件的最大值
    <input type='hidden' name='MAX_FILE_SIZE' VALUE='字节数' />
    
  • 通过accept属性限制上传文件类型
    <input type='file' name='myFile' accept='文件的MIME类型' />
    

6、在客户端的限制,用户可在网页上修改代码后上传,故无实际意义。应在服务器端加以限制

  • 限制上传文件的大小
  • 限制上传文件类型
  • 检测是否为真实图片类型
  • 检测是否为HTTP POST方式上传

7、完整代码如下:

upload.php

<!DOCTYPE html>

<html>

<head>

<title>文件上传www.linuxidc.com</title>

<meta charset="utf-8">

</head>

<body>

<form action="test.php" method="post" enctype="multipart/form-data" >

请选择要上传的文件:

<input type="file" name="myFile" /><br />

<input type="submit" value="上传文件" />

</form>

</body>

</html>

test.php

<?php

header('content-type:text/html;charset=utf-8');

include_once 'upload.func.php';

//上传封装函数的五个参数:$fileInfo,$maxsize,$uploadPath,$allowExt,$flag

$fileInfo=$_FILES['myFile'];

// print_r($_FILES);

// exit;

// $filename=$_FILES['myFile']['name'];

// $type=$_FILES['myFile']['type'];

// $tmp_name=$_FILES['myFile']['tmp_name'];

// $size=$_FILES['myFile']['size'];

// $error=$_FILES['myFile']['error'];

$maxsize=2097152;

$uploadPath='uploads';

$allowExt=array('jpeg','jpg','png','gif');

$flag=true;

$newName=uploadFile($fileInfo,$maxsize,$uploadPath,$allowExt,$flag);

echo "上传成功,路径为:".$newName;

?>

upload.func.php

<?php

function uploadFile($fileInfo,$maxsize,$uploadPath,$allowExt,$flag){

//判断错误号

if($fileInfo['error']>0){

switch ($fileInfo['error']){

case '1':

$mes="上传文件超过了PHP配置文件中upload_max_filesize选项的值";

break;

case '2':

$mes="超过了表单MAX_FILE_SIZE限制的大小";

break;

case '3':

$mes="文件部分被上传";

break;   

case '4':

$mes="没有选择上传文件";       

break;

case '6':

$mes="没有找到临时目录";

break;

case '7':

case '8':

$mes="系统错误";

break;

}

exit($mes);

}

$ext=pathinfo($fileInfo['name'],PATHINFO_EXTENSION);

//检测上传文件的类型

if (!@in_array($ext,$allowExt)) {

exit('非法文件类型');

}

//检测上传文件的大小是否符合规范

//$maxsize=2097152;//默认值为2M

if ($fileInfo['size']>$maxsize) {

exit('上传文件超过'.($maxsize/1024/1024).'M');

}

//检测图片是否为真实图片类型,立flag,若不需要检测,则设置flag为false即可

//$flag=true;

if($flag){

if (!@getimagesize($fileInfo['tmp_name'])) {

exit('不是真实的图片类型');

}

}

//检测文件是否通过HTTP POST方式上传的

if (!@is_uploaded_file($fileInfo['tmp_name'])) {

exit('文件不是通过HTTP POST方式上传的');

}

//存储目录

if(!@file_exists($uploadPath)){

mkdir($uploadPath,0777,true);

chmod($uploadPath,0777);

}

$uniName=MD5(uniqid(microtime(true),true)).'.'.$ext;

$destination=$uploadPath.'/'.$uniName;

if (!@move_uploaded_file($fileInfo['tmp_name'], $destination)) {

exit('文件上传失败');

}

//echo "文件上传成功";

// return array{

//    'newName'=>$destination;

//    'size'=>$fileInfo['size'];

//    'type'=>$fileInfo['type']

// };

return $destination;

}

?>

本文永久更新链接地址 : http://www.linuxidc.com/Linux/2018-01/150624.htm


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

计算统计

计算统计

Geof H.Givens、Jennifer A.Hoeting / 王兆军、刘民千、邹长亮、杨建峰 / 人民邮电出版社 / 2009-09-01 / 59.00元

随着计算机的快速发展, 数理统计中许多涉及大计算量的有效方法也得到了广泛应用与迅猛发展, 可以说, 计算统计已是统计中一个很重要的研究方向. 本书既包含一些经典的统计计算方法, 如求解非线性方程组的牛顿方法、传统的随机模拟方法等, 又全面地介绍了近些年来发展起来的某些新方法, 如模拟退火算法、基因算法、EM算法、MCMC方法、Bootstrap方法等, 并通过某些实例, 对这些方法的应用进行......一起来看看 《计算统计》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具