快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

PHP文件上传的详细思路及实现

最近一段时间对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 "<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);
  $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>

返回类别: 教程
上一教程: 测试已经无误,重新发布的修改后的分页类,附点说明
下一教程: PHPbb2.0.15远程命令执行漏洞利用程序

您可以阅读与"PHP文件上传的详细思路及实现"相关的教程:
· 如何用PHP实现文件上传例子
· 文件上传的实现
· 用PHP实现文件上传二法
· 用PHP实现给上传的图片加水印的代码
· PHP实现多文件上载的系统程序
    微笑服务 优质保证 索取样品