php怎么实现文件分类上传,PHP文件上传的实现及其介绍

关于实现及介绍在程序注释中。

提交文件的页面:(可以分别提交到doAction.php、doAction1.php、doAction2.php进行测试)

upload.php

文件上传

请选择您要上传的文件:

doAction.php

/**

* Created by PhpStorm.

* User: DreamBoy

* Date: 2016/4/8

* Time: 15:17

*/

//$_FILES:文件上传变量

/*

* $_FILES中保存着上传文件的信息

* name:上传文件的名称

* type:上传文件的MIME类型

* tmp_name:上传到服务器上的临时文件名

* size:上传文件的大小

* error:上传文件的错误号

*/

print_r($_FILES);

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

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

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

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

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

//上传方式

//第一种方式:

//将服务器上的临时文件移动到指定目录下,移动成功返回true,否则返回false。

//move_uploaded_file($tmp_name, $destination);

//move_uploaded_file($tmp_name, 'uploads/' . $filename);

//第二种方式:

//copy($src,$dst) :将文件拷贝到指定目录,拷贝成功返回true,否则返回false

//copy($tmp_name, 'uploads/' . $filename);

/*

* 文件上传配置

* 服务器端配置:

* file_uploads = On, 支持HTTP上传

* upload_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请求,给予线程最大的内存使用量的定义。

*/

/*

* 错误信息说明

* UPLOAD_ERR_OK:其值为0,没有错误发生,文件上传成功

* UPLOAD_ERR_INT_SIZE:其值为1,上传的文件超过了php.ini中uploaded_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扩展程序中断。

*/

doAction1.php

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

/**

* Created by PhpStorm.

* User: DreamBoy

* Date: 2016/4/8

* Time: 16:37

*/

//1.通过$_FILES文件上传变量接收上传文件信息

$fileInfo = $_FILES['myFile'];

$filename = $fileInfo['name'];

$type = $fileInfo['type'];

$tmp_name = $fileInfo['tmp_name'];

$size = $fileInfo['size'];

$error = $fileInfo['error'];

//2.判断下错误号,只有为0或者是UPLOAD_ERR_OK,没有错误发生,上传成功。

if($error == UPLOAD_ERR_OK) {

if(move_uploaded_file($tmp_name, 'uploads/' . $filename)) {

echo '文件' . $filename . '上传成功';

} else {

echo '文件' . $filename . '上传失败';

}

} else {

//匹配错误信息

switch($error) {

case 1:

echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';

break;

case 2:

echo '超过了表单MAX_FILE_SIZE限制的大小';

break;

case 3:

echo '文件部分被上传';

break;

case 4:

echo '没有选择上传文件';

break;

case 6:

echo '没有找到临时目录';

break;

case 7:

case 8:

echo '系统错误';

break;

}

}

/*

* 上传文件限制

* 服务器端限制:

* 限制上传文件大小

* 限制上传文件类型

* 检测是否为真是图片类型

* 检测是否为HTTP POST方式上传

*/

doAction2.php

/**

* Created by PhpStorm.

* User: DreamBoy

* Date: 2016/4/8

* Time: 17:45

*/

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

$fileInfo = $_FILES['myFile'];

$maxSize = 2097152; //2 * 1024 * 1024;

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

$flag = true; //检测是否为真实图片类型

//1.判断错误号

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

//判断上传文件的大小

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

exit('上传文件过大');

}

echo $fileInfo['type']; exit;

//$ext = strtolower(end(explode('.', $fileInfo['name'])));

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

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

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

}

//判断文件是否是通过HTTP POST方式上传来的

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

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

}

//检测是否为真实的图片类型

/*

* getimagesize($filename):得到指定图片的信息,如果是图片返回数组

* 如果不是图片(哪怕文件的后缀是图片的格式,实际上不是图片的话),返回false。

*/

if($flag) {

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

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

}

}

$path = 'uploads';

//php利用mkdir创建多级目录 http://www.daixiaorui.com/read/38.html

/*

* mkdir($path,0777,true);

* 第一个参数:必须,代表要创建的多级目录的路径;

* 第二个参数:设定目录的权限,默认是 0777,意味着最大可能的访问权;

* 第三个参数:true表示允许创建多级目录。

*/

/*

* chmod() 函数改变文件模式。

* 如果成功则返回 TRUE,否则返回 FALSE。

*/

if(!file_exists($path)) {

mkdir($path, 0777, true); // 0777表示可读可写可执行

chmod($path, 0777);

}

//确保文件名位移,放置重名产生覆盖

/*

* uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID。

* 语法

* uniqid(prefix,more_entropy)

* 参数描述

* prefix可选。为 ID 规定前缀。如果两个脚本恰好在相同的微秒生成 ID,该参数很有用。

* more_entropy可选。规定位于返回值末尾的更多的熵。

*/

/*

* microtime()返回当前 Unix 时间戳和微秒数。

* PHP函数microtime()语法

* microtime(get_as_float)

* PHP函数microtime()参数与描述

* get_as_float 如果给出了 get_as_float 参数并且其值等价于 TRUE,该函数将返回一个浮点数。

* 通俗地说,带参数true表明只返回一个浮点数(即秒数),不带参数返回一个微秒+秒的字符串。

* <?php

* echo microtime();

* echo "
";

* echo microtime(true);

* ?>

* 结果如下:

* 0.00000600 1283757623

* 1283757623

*/

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

//$destination = $path . '/' . $fileInfo['name'];

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

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

echo '文件上传成功';

} else {

echo '文件上传失败';

}

} else {

//匹配错误信息

switch($fileInfo['error']) {

case 1:

echo '上传文件超过了PHP配置文件中upload_max_filesize选项的值';

break;

case 2:

echo '超过了表单MAX_FILE_SIZE限制的大小';

break;

case 3:

echo '文件部分被上传';

break;

case 4:

echo '没有选择上传文件';

break;

case 6:

echo '没有找到临时目录';

break;

case 7:

case 8:

echo '系统错误';

break;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值