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,文件下載
<?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();
}
?>
二,文件上傳程序
<?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"數據記錄插入失敗";
}
}
}
?>