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

  •   2009-07-31/22:49
  • 文件上传我们需要用到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 = ]);
    $url_this = ];

    $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 <script>window.location.href='$url_this?message=deleted successfully'</script>;
    }
    }
    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 <script>window.location.href='$url_this?message=$message'</script>;
    }
    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 .= <a href='$upload_dir$file'>.$file.</a>;
    if ($DELETABLE)
    $filelist .= <a href='?del=$upload_dir$file' title='delete'>x</a>;
    $filelist .= <sub><small><small><font color=grey> .date(d-m H:i, filemtime($upload_dir.$file))
    .</font></small></small></sub>;
    $filelist .=<br>;
    }
    }

    function do_upload($upload_dir, $upload_url) {

    $temp_name = $_FILES['userfile']['tmp_name'];
    $file_name = $_FILES['userfile']['name'];
    $file_name = str_replace();
    $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;
    }

    ?>

    <center>
    <font color=red><?=$_REQUEST[message]?></font>
    <br>
    <form name=upload id=upload ENCTYPE=multipart/form-data method=post>
    Upload File <input type=file id=userfile name=userfile>
    <input type=submit name=upload value=Upload>
    </form>

    <br><b>My Files</b>
    <hr width=70%>
    <?=$filelist?>
    <hr width=70%>
    <small><sup>Developed By
    <a style=text-decoration:none href=http://tech.citypost.ca>CityPost.ca</a>
    </sup></small>
    </center>
     


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多