php上传文件问题汇总


Posted in PHP onJanuary 30, 2015

1.先做个最简单的上传文件

 <html>

 <head>

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

 </head>

 <body>

 <form action="upload_file.php" method="post"

 enctype="multipart/form-data">

 <label for="file">Filename:</label>

 <input type="file" name="file" id="file" /> 

 <br />

 <input type="submit" name="submit" value="Submit" />

 </form>

 </body>

 </html>
 <?php

 if (($_FILES["file"]["size"] < 20000)

   {

   if ($_FILES["file"]["error"] > 0)

     {

     echo "Return Code: " . $_FILES["file"]["error"] . "<br />";

     } 

   else

     {

     echo "Upload: " . $_FILES["file"]["name"] . "<br />";

     echo "Type: " . $_FILES["file"]["type"] . "<br />";

     echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";

     echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

     if (file_exists("upload/" . $_FILES["file"]["name"]))

       {

       echo $_FILES["file"]["name"] . " already exists. ";

       }

     else

       {

       move_uploaded_file($_FILES["file"]["tmp_name"],

       "upload/" . $_FILES["file"]["name"]);

       echo "Stored in: " . "upload/" . $_FILES["file"]["name"];

       }

     }

   }

 else

   {

   echo "Invalid file";

   }

 ?>

2.然后了解超级全局变量$_FILES的值

$_FILES['userfile']['name']

$_FILES['userfile']['type']

$_FILES['userfile']['size']

$_FILES['userfile']['tmp_name']

$_FILES['userfile']['error']

其中,$_FILES['userfile']['error']的所有值:

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,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

UPLOAD_ERR_CANT_WRITE 其值为 7,文件写入失败。PHP 5.1.0 引进。

3.很多情况:需要严格判断上传文件类型

     我们知道使用$_FILES['userfile']['type']判断上传文件类型是一个很不明智的做法,因为该判断依据是文件的后缀名,任何人都可以将一个mp3文件的后缀改成jpg从而伪装成图片进行上传,因此php官方建议使用php的扩展php_fileinfo来判断文件的mime,开启拓展的方法百度一下有很多,win和linux略有不同。

4.情景一:上传文件重名后自动重命名

if (file_exists("./upload/" . $_FILES["file"]["name"]))  

{    

   do{  

       $suffix ="";  

       $suffix_length = 4;  

       $str = "0123456789abcdefghijklmnopqrstuvwxyz";  

       $len = strlen($str)-1; 

       //文件名后追加4个随机字符  

       for($i=0 ; $i<$suffix_length; $i++){  

          $suffix .= $str[rand(0,$len)];  

       }  

       $upload_filename = $_FILES['file']['name'];                                            

       $filename = substr($upload_filename,0,strrpos($upload_filename,".")).$suffix.".".substr($upload_filename,strrpos($_FILES["file"]["name"],".")+1); 

   }while(file_exists("./upload/".$filename));  

       move_uploaded_file($_FILES["file"]["tmp_name"],"./upload/" . $filename);  

}else{  

       move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);   

} 

5.情景二:根据日期分目录上传文件

 $structure = './'.date("Y").'/'.date("m").'/'.date("d").'/';

 if (!mkdir($structure, 0777, true)) {

     die('Failed to create folders...');

 }

 move_uploaded_file($_FILES["file"]["tmp_name"],$structure . $_FILES["file"]["name"]);

6.情景三:多文件上传

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

 <p>Pictures:

 <input type="file" name="pictures[]" />

 <input type="file" name="pictures[]" />

 <input type="file" name="pictures[]" />

 <input type="submit" value="Send" />

 </p>

 </form>
 <?php

 foreach ($_FILES["pictures"]["error"] as $key => $error) {

     if ($error == UPLOAD_ERR_OK) {

         $tmp_name = $_FILES["pictures"]["tmp_name"][$key];

         $name = $_FILES["pictures"]["name"][$key];

         move_uploaded_file($tmp_name, "data/$name");

     }

 }

 ?>

 
有的情况下多文件的这种变量结构并不好用:
array(1) {

    ["upload"]=>array(2) {

        ["name"]=>array(2) {

            [0]=>string(9)"file0.txt"

            [1]=>string(9)"file1.txt"

        }

        ["type"]=>array(2) {

            [0]=>string(10)"text/plain"

            [1]=>string(10)"text/html"

        }

    }

}

很多情况下我们需要的是类似这样的结构

array(1) {

    ["upload"]=>array(2) {

        [0]=>array(2) {

            ["name"]=>string(9)"file0.txt"

            ["type"]=>string(10)"text/plain"

        },

        [1]=>array(2) {

            ["name"]=>string(9)"file1.txt"

            ["type"]=>string(10)"text/html"

        }

}

}

使用下面的函数就能轻松转化结构

 function diverse_array($vector) { 

     $result = array(); 

     foreach($vector as $key1 => $value1) 

         foreach($value1 as $key2 => $value2) 

             $result[$key2][$key1] = $value2; 

     return $result; 

 } 

 $upload = diverse_array($_FILES["upload"]);

7. 有的时候:需要配置服务器修改最大上传文件大小

首先,在表单上

<input type="hidden" name="MAX_FILE_SIZE" value="字节" />
可以限制上传文件大小(可以被绕过)。

然后在服务器上也需要调整一下配置

php.ini:

max_execution_time = 30 每个脚本运行的最长时间,单位秒

max_input_time = 60,每个脚本可以消耗的时间,单位也是秒

memory_limit = 128M,这个是脚本运行最大消耗的内存

post_max_size = 8M,表单提交最大数据为 8M,此项不是限制上传单个文件的大小,而是针对整个表单的提交数据进行限制的。

upload_max_filesize = 2M ,上载文件的最大许可大小

nginx:

 location / {

     root   html;

     index  index.html index.htm;

     client_max_body_size    1000m;

  }

暂时先总结这些吧,希望小伙伴们能够喜欢。

PHP 相关文章推荐
PHP中simplexml_load_string函数使用说明
Jan 01 PHP
php表单请求获得数据求和示例
May 15 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
php获取文件后缀的9种方法
Mar 22 PHP
PHP针对字符串开头和结尾的判断方法
Jul 11 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
实例讲解php实现多线程
Jan 27 PHP
PHP之认识(二)关于Traits的用法详解
Apr 11 PHP
php设计模式之职责链模式定义与用法经典示例
Sep 19 PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 PHP
PHP文件缓存类示例分享
Jan 30 #PHP
php递归删除目录与文件的方法
Jan 30 #PHP
php递归法读取目录及文件的方法
Jan 30 #PHP
php实现简单文件下载的方法
Jan 30 #PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
Jan 30 #PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 #PHP
PHP速成大法
Jan 30 #PHP
You might like
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php获取apk包信息的方法
2014/08/15 PHP
非常实用的php验证码类
2016/05/15 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
2020/05/29 PHP
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
JavaScript 原型继承
2011/12/26 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
React中jquery引用的实现方法
2017/09/12 jQuery
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
python 正则式使用心得
2009/05/07 Python
python3音乐播放器简单实现代码
2020/04/20 Python
python django 实现验证码的功能实例代码
2017/05/18 Python
python数据结构之链表详解
2017/09/12 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
python中setuptools的作用是什么
2020/06/19 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
XML文档面试题
2015/08/05 面试题
《奇妙的国际互联网》 教学反思
2014/02/25 职场文书
心理咨询专业自荐信
2014/07/07 职场文书
写给医院的感谢信
2015/01/22 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
暑假开始了,你的暑假学习计划写好了吗?
2019/07/04 职场文书
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技