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 相关文章推荐
?繁体转换的class
Oct 09 PHP
php smarty函数扩展
Mar 15 PHP
使用bcompiler对PHP文件进行加密的代码
Aug 29 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
php随机抽奖实例分析
Mar 04 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP 断点续传实例详解
Nov 11 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
Jan 16 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
Jun 05 PHP
laravel 实现划分admin和home 模块分组
Oct 15 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中对2个数组相加的函数
2011/06/24 PHP
json的键名为数字时的调用方式(示例代码)
2013/11/15 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
PHP实现WebService的简单示例和实现步骤
2015/03/27 PHP
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
php生成图片验证码的方法
2016/04/15 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
js跨域访问示例(客户端/服务端)
2014/05/19 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
2017/10/26 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
python中的一些类型转换函数小结
2013/02/10 Python
Django框架多表查询实例分析
2018/07/04 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
Django Model层F,Q对象和聚合函数原理解析
2020/11/12 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
商务英语专业毕业生求职信
2014/07/06 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
老兵退伍感言
2015/08/03 职场文书
2016年中学清明节活动总结
2016/04/01 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
Django操作cookie的实现
2021/05/26 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏