web編程之上傳下載模塊(PHP+Mysql)

                        web編程之上傳下載模塊(PHP防盜鏈)          


一,文件上傳與下載原理解析                                                                                                                                                                                                    

1,文件上傳

 客戶端:注意form表單設置  enctype="multipart/form-data" 以確保匿名上傳文件的正確編碼。

  服務端:上傳處理文件upload.php,代碼如下:

 

<?php

$file = $_FILES['userfile'];  //接收表單信息
$dest_dir='up';               //設定上傳目錄     
$dest=$dest_dir.time().$file['name']; //設定文件名爲時間加文件名,可有效避免重複。
if(!$file)
    {
      echo"移動文件出錯";
      exit();
    }
else
    {
     $r=move_uploaded_file($file['tmp_name'],$dest);
     echo "上傳成功";
    }
?>

上例中$_FILES['userfile']數組的內容含義如下:

 $_FILES['userfile']['name']   :客戶端機器文件的原名稱                                                                                                                                                                                                                $_FILES['userfile']['type']  :文件的類型

$_FILES['userfile']['size']:文件的大小,單位爲B


2,文件下載

需要下載一個xxx.rar的文件,首先創建一個download.php的文件,可以很容易的通過文件的ID從數據庫中得到文件的真實存儲位置,可以通過header()函數的location參數直接重定向到這個文件,但這樣依然不安全。可以通過fread()函數把文件直接輸出到瀏覽器提示用戶下載。這樣所有處理都是在服務器端完成的,用戶就無法獲得文件的具體位置。代碼如下:

<?php
$file_name="xxxx.rar";
$file_dir="/up/";
if(!file_exists($file_dir.$file_name))
   {
     echo"文件找不到";
     exit();
   }
else
    {
    //打開文件
    $file=fopen($file_dir.$file_name,"r");
    //輸入文件標籤
    header("content-type:application/octer-stream");
    header("Accept-Ranges:bytes");
    header("Accept-Length:",filesize($file_dir.$file_name));
    header("Content-Disposition:attachment;filename=".$file_name);
    //輸出文件內容
    //讀取文件內容直接輸出到瀏覽器
    echo fread($file,filesize($file_dir.$file_name));
    fclose($file);
    exit();
}

?>



二,文件上傳程序


1,上傳文件的服務端處理(規定文件上傳類型,文件大小限制)


<?php
header("content-Type:text/html;charset=utf8");
$uptypes=array(
    'image/jpg',   //上傳文件類型列表
    'image/png',
    'image/jpeg',
    'image/gif',
    'image/bmp',
    'audio/mp3',
    'audio/x-ms-wma');
$max_file_size=20000000;     //上傳文件大小限制
$path_parts=pathinfo($_SERVER['PHP_SELF']);  //取得當前路徑
$destination_folder="up/";  //上傳文件路徑
$imgview=1;   //是否生成預覽圖(1爲生成,其他不生成)
$imgreviewsize=1/2;  //縮略圖比例
$fiele=$_FILE['userfile'];
if ($max_file_size<$file['size'])
   {
    echo "文件太大";
    exit();
    }
if(!in_array($file['type'],$uptypes))
                                                                               
  {
   echo"不能上傳此文件類型";
   exit();
   }
if(!file_exists($destinatuon_folder))
   {
    mkdir($destination_folder);
   }
$filename=$file["tmp_name"];
$image_size=getimagesize($filename);  //getimagesize() 獲得一個三元組,分別是圖片長寬,類型
$pinfo=pathinfo($file["name"];   //pathinfo() 函數以數組的形式返回文件路徑的信息。
$ftype=$pinfo['extension'];
$destination=$destination.time().".".$ftype;
$fname=time().$type;
if(file_exists($destination)&&$overwrite!=true)
    {
      echo "同名文件已經存在。";
      exit();
    }
 //移動文件異常處理
if(!move_uploaded_file($filename,$destination))
     {
      echo"移動文件出錯。";               
      exit();                
    }
else
    {
        //添加寫入數據庫的部分
        $con mysql_connect('location','root','sspku') or die ("數據庫連接失敗。");
        $db=mysql_select_db("zrfpku");
        if(!$db)
           {
           die("can't  use this  DB") 
           }
        else
          {
           $sql="insert into f_detail ('id','fname','ftype','des','url','utime') values ........";
           $result=mysql_query($sql);
            if(!$result)
            {
              mysql_free_result($resuly); 
              mysql_close($db);
                echo"數據記錄插入失敗";
            }
        
          }
    }

?>


三,文件下載程序(略,見原理)

                                                                                                                                                                                                                                                                     
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章