一、关于全局变量$_FILES

  1. $_FILES包含有所有上传的文件信息。假设文件上传字段的名称为 img。则

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

$_FILES['img']['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 引进。

  1. move_uploaded_file
    文件被上传后,默认地会被储存到服务端的默认临时目录中(除非 php.ini 中的 upload_tmp_dir设置为其它的路径),文件名是随机的。如果该文件没有被移动到其它地方也没有被改名,则该文件将在表单请求结束时被删除。因此需要通过move_uploaded_file移动临时文件。
    语法:move_uploaded_file ($filename,$destination )

二、实例:PHP实现文件上传

上传文件功能由两个部分组成,HTML页面和PHP处理部分。HTML页面主要是让用户选择所要上传的文件,PHP部分让我们可以把文件存储到服务器的指定目录。

html部分:uploadFile.html

 <!DOCTYPE html>
 <html>
 <head>
    <meta http-equiv="Content-Type" content="text/html"; charset="utf-8" />
    <title>PHP上传文件</title>
 </head>
 <body>
    <form method="post" action="upload.php" enctype="multipart/form-data">
    <table border=0 cellspacing=0 cellpadding=0 align=center width="100%">
        <tr>
            <td width=55 height=20 align="center">
                <input type="hidden" name="MAX_FILE_SIZE" value="2000000">文件:
            </td>
            <td height="16">
                <input name="file" type="file"  value="浏览" >
                <input type="submit" value="上传" name="B1">
            </td>
        </tr>
    </table>
    </form>
 </body>
 </html>

效果图:

说明:

  1. <form method="post" action="upload.php" enctype="multipart/form-data">
    表单中必须设置enctype="multipart/form-data,这样,服务器就知道上传文件带有常规表单信息。

  2. <input type="hidden" name="MAX_FILE_SIZE" value="2000000">
    用一个隐藏域来限制上传文件的最大长度,这里name必须设置成MAX_FILE_SIZE,其值就是上传文件的最大长度,单位是B,这里限制为文件最大2M。此外php.ini中设置的上传文件最大长度可能会影响到你的实际上传,需要根据实际情况修改。

  3. <input name="file" type="file" value="浏览" >
    type="file"说明了文件类型,这样一个基本的上传文件接口就完成了,接下来讲讲如何用PHP来处理上传的文件,此外PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,请根据实际情况修改。

php部分:upload.php

// 允许上传的图片类型
$allowedExts = array("gif", "jpeg", "jpg", "png");
// 获取文件后缀名
$temp = explode(".", $_FILES["file"]["name"]);  //输出:Array ( [0] => deer [1] => jpg )
$extension = end($temp);

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
&& in_array($extension, $allowedExts)) {
    if ($_FILES["file"]["error"] > 0) {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    } else {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";

        // 判断当前目录下是否存在该文件
        if (file_exists("./" . $_FILES["file"]["name"])) {
            echo $_FILES["file"]["name"] . " 文件已经存在。 ";
        } else {// 如果没有该目录,创建目录
            move_uploaded_file($_FILES["file"]["tmp_name"], "./" . $_FILES["file"]["name"]);
            echo "文件存储在: " . "./" . $_FILES["file"]["name"];
        }
    }
} else {
    echo "非法的文件格式";
}

效果图:

三、扩展:

  1. 获取文件后缀名
    上例中使用的是end()函数。end() 函数将数组内部指针指向最后一个元素,如果成功则返回该元素的值;如果数组为空则返回FALSE。
    语法:end(array)。
    除了使用end()函数获取文件后缀名外,还可以使用substr()函数、explode()函数获取文件后缀名,如下:

function getFileExt($filename) {
    return substr(strrchr($filename, '.'), 1);
}  

function getFileExt($filename){
    $temp = explode(".", $filename);
    return $temp[count($temp)-1];
}
  1. 生成随机文件名

  • 方法1:预置一个的字符串$chars ,包括 a–z,A–Z,0–9,以及一些特殊字符,生成固定长度的随机字符串。
function random($length) {
    $file_name = 'CR-';
    $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    $max = strlen($chars) - 1;
    mt_srand((double)microtime() * 1000000);
    for($i = 0; $i < $length; $i++) {
        //取字符数组 $chars 的任意元素
        $file_name .= $chars[mt_rand(0, $max)];
        //使用 substr 截取$chars中的任意一位字符
        //$file_name .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
    }
    return $file_name;
}
  • 方法2:使用时间戳作为文件名

1、time():返回的结果即当前的时间戳(10位);
2、strtotime(date('Y-d-m H:i:s')):时间日期转换为时间戳(10位);
3、获取毫秒级时间戳(13位)
php本身没有提供返回毫秒数的函数,但提供了microtime()方法,它会返回一个数组,包含两个元素:一个是秒数、一个是小数表示的毫秒数,我们可以通过如下方法获取返回的毫秒数:

<?php
    function getMillisecond() {
        list($t1, $t2) = explode(' ', microtime());
        return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
    }
    echo getMillisecond();

PHP实现文件上传的更多相关文章

  1. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  2. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  3. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  4. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  5. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

  6. Web开发安全之文件上传安全

    很长一段时间像我这种菜鸡搞一个网站第一时间反应就是找上传,找上传.借此机会把文件上传的安全问题总结一下. 首先看一下DVWA给出的Impossible级别的完整代码: <?php if( iss ...

  7. AutoIt实现Webdriver自动化测试文件上传

    在运用WebDriver进行自动化测试时,由于WebDriver自身的限制,对于上传文件时Windows弹出的文件选择窗口无法控制,通过在网上查找资料锁定使用AutoIt来控制文件上传窗口. Auto ...

  8. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  9. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(32)-swfupload多文件上传[附源码]

    系列目录 文件上传这东西说到底有时候很痛,原来的asp.net服务器控件提供了很简单的上传,但是有回传,还没有进度条提示.这次我们演示利用swfupload多文件上传,项目上文件上传是比不可少的,大家 ...

随机推荐

  1. Java 接口练习题

    中国特色社会主义的体制中有这样的现象:地方省政府要坚持党的领导和按 照国务院的指示进行安全生产.请编写一个java应用程序描述上述的体制现象. 要求如下: (1)该应用程序中有一个“党中央”接口:Ce ...

  2. redis和memcached

    Redis 1.主从配置(主从复制不会阻塞master.) 1)bind  192.168.1.2(请修改成本机的IP地址,要不然,客户端无法进行访问) 2)slaveof 192.168.1.1 6 ...

  3. 关于HandlerThread的分析

    Android中的Thread没有对java中的Thread做任何封装,而Android提供了一个遍历方法HandlerThread,他继承于Thread,实现了对遍历系统的一些封装,下面研究一下Ha ...

  4. Http组件的介绍

    do_Http组件就是实现http/https协议的组件. 首先要说明一下,Do平台只是一个移动端开发的平台,不涉及任何后台服务端的技术,你可以使用你自己任何熟悉的语言和技术来实现服务端,do_Htt ...

  5. lower函数

    将大写字母变成小写 >>> a='AAABBBccc' >>> a.lower() 'aaabbbccc'

  6. 大数据 > 数据平台方案评估

    分类 当前措施 说明 百度竞价如何进行数据分析(SEM工程师)数据来源: 1. 百度后台推广数据:api 总展现 总点击 点击率 总消费 点击均价 BDP功能点 1. 串联百度->网站商务通-& ...

  7. MATLAB地图工具箱学习总结(三)地图工具箱的基本知识

    MATLAB地图工具箱学习总结(三)地图工具箱的基本知识 今天想要介绍的是一些比较基础的函数.了解了这些函数,地图投影的基本概念才能真正明白.而要想继续研究MATLAB中有关地图投影的函数,尤其是未来 ...

  8. 公钥私钥和RSA算法

    1, RSA算法原理(一) http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html 2, RSA算法原理(二) http: ...

  9. 游戏对象消失三种方法的区别?(enabled/Destroy/active)

    gameObject.renderer.enabled=fasle是控制一个物体是否在屏幕上渲染或显示  而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的GameObject.De ...

  10. 后缀数组:倍增法和DC3的简单理解

    一些定义:设字符串S的长度为n,S[0~n-1]. 子串:设0<=i<=j<=n-1,那么由S的第i到第j个字符组成的串为它的子串S[i,j]. 后缀:设0<=i<=n- ...