• 技术文章 >后端开发 >php教程

    PHP文件上传的具体思路及实现_PHP

    2016-06-01 12:33:09原创269
    最近一段时间对PHP文件处理方面很感兴趣,因此在许多站点上看了许多的文件处理的文章,但是国内许多的站点上的PHP文件处理方面的知识大多数是你抄我的我抄你的,用baidu.com或者是google.com搜索出来的东西多是重复的。最近在国外一个站点上盾了一篇文章感觉很不错,因此推荐给大家阅读。

    首先我们有必要说明一下文件上传的操作流程及用到的知识点:

    文件上传我们需要用到HTML里面表单的type="file"类型,及其enctype属性。这是我们大家必须要用的。当然了PHP函数库当中的FILE函数库,字符串类型函数库,目录函数库及$_FILES[]的使用是我们必须要用到的。

    也许每一个站点都可能会对上传文件有许多的限制,这些限制会包括 文件类型,文件大小,扩展名,以及上传目录的存在与否,上传文件的存在与否,目录的可写性,可读性,上传文件的改名及怎样把文件从缓存当中复制到你所需要的目录当中。

    当然出错的预处理也是我们不容忽视的!如果再深一步的讨论我们还可以对文件的操作起用事件日志的记录。

    下面我们通过一段程序来实现这些功能:

    --------------------------------------------------------------------------------------------


    首先是我们预设的变量值,它包括文件大小,文件扩展名类型,MIMI类型,及是否删除的开关变量

    $MAX_SIZE = 2000000;
    $FILE_MIMES = array('image/jpeg','image/jpg','image/gif'
    ,'image/png','application/msword');

    $FILE_EXTS = array('.zip','.jpg','.png','.gif');

    $DELETABLE = true;


    下一部就是设置浏览器访问变量及目录访问变量:

    $site_name = $_SERVER['HTTP_HOST'];
    $url_dir = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']);
    $url_this = "http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

    $upload_dir = "files/";
    $upload_url = $url_dir."/files/";
    $message ="";


    建立上传目录并相应改变权限:

    if (!is_dir("files")) {
    if (!mkdir($upload_dir))
    die ("upload_files directory doesn't exist and creation failed");
    if (!chmod($upload_dir,0755))
    die ("change permission to 755 failed.");
    }



    用户请求的处理:

    if ($_REQUEST[del] && $DELETABLE) {
    $resource = fopen("log.txt","a");
    fwrite($resource,date("Ymd h:i:s")."DELETE - $_SERVER[REMOTE_ADDR]"."$_REQUEST[del]\n");
    fclose($resource);

    if (strpos($_REQUEST[del],"/.")>0); //possible hacking
    else if (strpos($_REQUEST[del],"files/") === false); //possible hacking
    else if (substr($_REQUEST[del],0,6)=="files/") {
    unlink($_REQUEST[del]);
    print "";
    }
    }
    else if ($_FILES['userfile']) {
    $resource = fopen("log.txt","a");
    fwrite($resource,date("Ymd h:i:s")."UPLOAD - $_SERVER[REMOTE_ADDR]"
    .$_FILES['userfile']['name']." "
    .$_FILES['userfile']['type']."\n");
    fclose($resource);

    $file_type = $_FILES['userfile']['type'];
    $file_name = $_FILES['userfile']['name'];
    $file_ext = strtolower(substr($file_name,strrpos($file_name,".")));

    //文件大小的检查:


    if ( $_FILES['userfile']['size'] > $MAX_SIZE)
    $message = "The file size is over 2MB.";
    //File Type/Extension Check
    else if (!in_array($file_type, $FILE_MIMES)
    && !in_array($file_ext, $FILE_EXTS) )
    $message = "Sorry, $file_name($file_type) is not allowed to be uploaded.";
    else
    $message = do_upload($upload_dir, $upload_url);

    print "";
    }
    else if (!$_FILES['userfile']);
    else
    $message = "Invalid File Specified.";

    列出我们上传的文件:

    $handle=opendir($upload_dir);
    $filelist = "";
    while ($file = readdir($handle)) {
    if(!is_dir($file) && !is_link($file)) {
    $filelist .= "".$file."";
    if ($DELETABLE)
    $filelist .= " x";
    $filelist .= " ".date("d-m H:i", filemtime($upload_dir.$file))
    ."
    ";
    $filelist .="
    ";
    }
    }

    function do_upload($upload_dir, $upload_url) {

    $temp_name = $_FILES['userfile']['tmp_name'];
    $file_name = $_FILES['userfile']['name'];
    $file_name = str_replace("\\","",$file_name);
    $file_name = str_replace("'","",$file_name);
    $file_path = $upload_dir.$file_name;

    //File Name Check
    if ( $file_name =="") {
    $message = "Invalid File Name Specified";
    return $message;
    }

    $result = move_uploaded_file($temp_name, $file_path);
    if (!chmod($file_path,0777))
    $message = "change permission to 777 failed.";
    else
    $message = ($result)?"$file_name uploaded successfully." :
    "Somthing is wrong with uploading a file.";
    return $message;
    }

    ?>






    Upload File




    My Files





    Developed By
    CityPost.ca

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:第六节--访问属性和方法 -- Classes and Objects in PHP5 [6]_PHP 下一篇:第一节--面向对象编程 -- Classes and Objects in PHP5 [1]_PHP
    千万级数据并发解决方案

    相关文章推荐

    • 什么是php-fpm?如何进行优化来提升性能?• 实例详解怎么用PHP实现简易的MVC框架• 消息队列RabbitMQ入门与PHP实例详解• 看不懂这两行代码啊 请教下• PHP开发者常犯的MySQL错误
    1/1

    PHP中文网