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

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

内容简介: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


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

查看所有标签

猜你喜欢:

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

Web Caching

Web Caching

Duane Wessels / O'Reilly Media, Inc. / 2001-6 / 39.95美元

On the World Wide Web, speed and efficiency are vital. Users have little patience for slow web pages, while network administrators want to make the most of their available bandwidth. A properly design......一起来看看 《Web Caching》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

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

HSV CMYK互换工具