宝马娱乐在线城-宝马娱乐在线

来自 互联网络 2019-10-01 21:34 的文章
当前位置: 宝马娱乐在线城 > 互联网络 > 正文

PHP多文件上传宝马娱乐在线

多文件上传是PHP中一基础应用,在此把相关知识向大家详细介绍一下,本人水平有限,还请多提意见。大家一起进步。
        上传文件HTML的输入标签FILE类型中的名称后要加[],作用是在HTML中向PHP建立数组,比如名称为pictures,多文件引用名称则为pictures[],实例如下:
复制内容到剪贴板

把php上传文件时经常碰到的几个问题总结一下吧,以后用到时不用再去找了。

<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="submit" value="上传" />
</p>
</form> //手册中实例。
利用HTML文件建立数组的方法手册中是这样讲解的:

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

        要使你的 <form> 结果被当成 array 发送到 PHP 脚本,要对 <input>,<select> 或者 <textarea> 单元这样命名:
           <input name="MyArray[]" />
           <input name="MyArray[]" />
           <input name="MyArray[]" />
           <input name="MyArray[]" />
        注意变量名后的方括号,这使其成为一个数组。

复制代码 代码如下:

        可以通过给不同的单元分配相同的名字来把单元分组到不同的数组里:
           <input name="MyArray[]" />
           <input name="MyArray[]" />
           <input name="MyOtherArray[]" />
           <input name="MyOtherArray[]" />
        这将产生两个数组,MyArray 和 MyOtherArray,并发送给 PHP 脚本。

 <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>

        还可以给数组分配指定的键名:
           <input name="AnotherArray[]" />
           <input name="AnotherArray[]" />
           <input name="AnotherArray[email]" />
           <input name="AnotherArray[phone]" />
        AnotherArray 数组将包含键名 0,1,email 和 phone。

复制代码 代码如下:

        注意: 指定数组的键名是 HTML 的可选项。如果不指定键名,则数组被按照单元在表单中出现的顺序填充。第一个例子将包含键名 0,1,2,3。

<?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";
  }
?>

        以上HTML点击上传后,通过$_FILES超级全局变量进行读取,$_FILES将会把HTTP POST 方法传递上来的文件信息组合成数组,一个文件数组形式为二维。二个以上文件数组形式为三维。

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

   $_FILES的使用方法:
$_FILES['userfile']['name']
客户端机器文件的原名称。
$_FILES['userfile']['type'] 文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。
$_FILES['userfile']['size'] 已上传文件的大小,单位为字节。
$_FILES['userfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。
$_FILES['userfile']['error']

复制代码 代码如下:

        下面是一个文件上传,此文件上传后$_FILES数组内将会产生其信息,因为是一个文件所以是二维的,为了便于大家理解我们将$_FILES用PRINT_R输出查看其结构。

$_FILES['userfile']['name']
$_FILES['userfile']['type']
$_FILES['userfile']['size']
$_FILES['userfile']['tmp_name']
$_FILES['userfile']['error']

HTML文件:

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

<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<input type="file" name="pictures" /><br />
<input type="submit" value="上传" />
</p>
</form>
PHP接收文件:

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

         
<?php
print_r($_FILES);
?>
将其令存为UPLOAD.PHP,运行上面的HTML选择一个文件上传,比如文件名为Thumbs.db,在IE浏览器内单击“查看”,“源代码”。显示如下:
Array
(
    [pictures] => Array
        (
            [name] => Thumbs.db                                                       //原文件名
            [type] => application/octet-stream                                     //文件类型
            [tmp_name] => D:EasyPHPtmpphp64.tmp                    //临时存储目录及文件名
            [error] => 0                                                                       //错误代码 0为上传成功
            [size] => 23040                                                                 //文件大小
        )
)根据此信息,结合上面$_FILES的使用方法,大家应该能理解的更深刻一些。

UPLOAD_ERR_INI_SIZE 其值为 1,上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。

下面看一下多文件上传,三个文件名分别为FILE1.TXT,FILE2.TXT,FILE3.TXT,然后用PRINT_R输出查看其结构:

UPLOAD_ERR_FORM_SIZE 其值为 2,上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。

HTML文件代码:

UPLOAD_ERR_PARTIAL 其值为 3,文件只有部分被上传。

<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="file" name="pictures[]" /><br />
<input type="submit" value="上传" />
</p>
</form>
PHP接收文件代码:

UPLOAD_ERR_NO_FILE 其值为 4,没有文件被上传。

         
<?php
print_r($_FILES);
?>
查看源文件:

UPLOAD_ERR_NO_TMP_DIR 其值为 6,找不到临时文件夹。PHP 4.3.10 和 PHP 5.0.3 引进。

Array
(
    [pictures] => Array
        (
            [name] => Array
                (
                    [0] => file1.txt
                    [1] => file2.txt
                    [2] => file3.txt
                )
            [type] => Array
                (
                    [0] => application/octet-stream
                    [1] => application/octet-stream
                    [2] => application/octet-stream
                )
            [tmp_name] => Array
                (
                    [0] => D:EasyPHPtmpphp47.tmp
                    [1] => D:EasyPHPtmpphp48.tmp
                    [2] => D:EasyPHPtmpphp49.tmp
                )
            [error] => Array
                (
                    [0] => 0
                    [1] => 0
                    [2] => 0
                )
            [size] => Array
                (
                    [0] => 94289
                    [1] => 65536
                    [2] => 102400
                )
        )
)
        假设名为 /file1.txt  和 /file2.txt 的文件被提交,则 $_FILES['pictures']['name'][0] 的值将是 file1.txt,而 $_FILES['pictures']['name'][1] 的值将是 file2.txt。类似的,$_FILES['file2.txt']['size'][0] 将包含文件 file1.txt 的大小,依此类推。

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"]);

本文由宝马娱乐在线城发布于互联网络,转载请注明出处:PHP多文件上传宝马娱乐在线

关键词: