檔案上傳
目的:使用者可以通過浏覽器,将本地檔案上傳到伺服器
以單檔案上傳為例
sinFun.php
<?php
/**
*檔案上傳函數
*
*@param string $name 檔案上傳檔案域的name值
*@param string $dir 檔案上傳的指定儲存路徑
*@param array $allow 檔案上傳允許的檔案類型
*
*return string $filename 檔案名 失敗時,傳回false
*
*/
function uploads($name,$dir,$allow=array('image/jpeg','image/png'))
{
//1. 判斷檔案上傳錯誤
if($_FILES[$name]['error'] > 0) {
//檔案上傳出錯
switch($_FILES[$name]['error']) {
case 1:
echo '上傳的檔案大小超過配置檔案中的upload_max_filesize值';
break;
case 2:
echo '上傳檔案的大小超過表單送出的最大值';
break;
case 3:
echo '檔案隻有部分上傳';
break;
case 4:
echo '沒有檔案被上傳';
break;
case 6:
echo '找不到臨時檔案夾';
break;
case 7:
echo '檔案寫入失敗';
break;
default :
echo '其它錯誤';
break;
}
return false;
}
//2. 判斷你上傳檔案的類型是否是你想要的類型
if(!in_array($_FILES[$name]['type'],$allow)) {
echo '檔案類型不符合';
return false;
}
//3. 擷取上傳檔案字尾名
$suffix = pathinfo($_FILES[$name]['name'],PATHINFO_EXTENSION);
//4. 起名字
$filename = date('Ymd').uniqid().mt_rand(0,9999999).'.'.$suffix;
//5. 判斷儲存的路徑是否存在
$save_path = rtrim($dir,'/');
$save_path .= '/';
$save_path .= date('Ymd');
// var_dump($save_path);
if(!file_exists($save_path)) {
mkdir($save_path,777,true);
}
//拼接一個完整的儲存路徑
$path = $save_path.'/'.$filename;
// var_dump($path);die;
//6 判斷是否是HTTP post方式上傳
if(!is_uploaded_file($_FILES[$name]['tmp_name'])) {
echo '傳輸方式不對';
return false;
}
//7 移動圖檔
if(!move_uploaded_file($_FILES[$name]['tmp_name'], $path)) {
echo '移動失敗';
return false;
}
//傳回移動成功的檔案名
return $filename;
}
?>
upload.html
<!DOCTYPE html>
<html lang="zh" dir="ltr">
<head>
<meta charset="utf-8">
<title>單檔案上傳</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
上傳頭像:<input type="file" name="profile" />
<button>送出</button>
</form>
<!--
注意:
1. 表單送出的方式必須是 post
2. form表單中必須添加enctype屬性
3. input 中要設定name屬性
-->
</body>
</html>
upload.php
<?php
include("./sinFun.php");
$result = uploads('profile','./upload',array('image/jpeg','image/png'));
var_dump($result);
?>