PHP檔案上傳和下載
阿新 • • 發佈:2018-12-24
內容整理自網上!
一、$_FILES預定義變數解析
name:上傳檔案的名稱
type:上傳檔案的MIME型別
tmp_name:上傳到伺服器上的臨時檔名
size:上傳檔案的大小
error:上傳檔案的錯誤號
二、服務端配置
file_uploads = On
upload_tmp_dir =”臨時檔案儲存目錄”
upload_max_filesize = 2M 允許檔案上傳的最大值
max_file_uploads = 20 允許一次上傳的最大檔案數
post_max_size = 8M POST方式傳送資料的最大值
max_execution_time = 120 設定了指令碼被解析器終止之前允許的最大執行時間,單位為秒,防止程式寫得不好而佔盡伺服器資源
max_input_time = 60 指令碼解析輸入資料允許的最大時間,單位是秒
max_input_nesting_level = 64 設定輸入變數的巢狀深度
記憶體限制:
max_input_vars = 2500 接受多少輸入的變數(限制分別應用於
memory_limit = 128M 最大單執行緒的獨立記憶體使用量,也就是一個web請求,給予執行緒最大的記憶體使用量的定義。
三、客戶端限制
客戶端限制可以輕易更改,沒什麼作用!
四、錯誤資訊說明
UPLOAD_ERR_OK:其值為0,沒有錯誤發生,檔案上傳成功
UPLOAD_ERR_INI_SIZE
UPLOAD_ERR_FROM_SIZE:其值為2,上傳檔案的大小超過了HTML表單中MAX_FILE_SIZE選項指定的值
UPLOAD_ERR_PARTIAL:其值為3,檔案只有部分被上傳
UPLOAD_ERR_NO_FILE:其值為4,沒有檔案被上傳
UPLOAD_ERR_NO_TMP_DIR:其值為6,找不到臨時資料夾
UPLOAD_ERR_CANT_WRITE:其值為7,檔案寫入失敗
UPLOAD_ERR_EXTENSION:其值為8,上傳的檔案被PHP擴充套件程式中斷
五、程式碼
1、單檔案上傳
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
請選擇你要上傳的檔案:
<input type="file" name="myFile">
<input type="submit" value="upload">
</form>
</body>
</html>
單檔案上傳方法:
<?php
/*
* 單檔案上傳
* 引數:
* (String)$fileInfo:上傳檔案資訊
* (String)$path:檔案存放目錄
* (Int)$maxSize:允許上傳的檔案最大大小,預設為2M
* (Array)$allowExt:允許上傳的副檔名
* (String)$flag:是否檢測上傳檔案是否為真實的圖片型別,預設不檢測
*/
function upload_single($fileInfo,$path='uploads/',$maxSize=2097152,$allowExt=null,$flag=false){
$destination=''; //上傳後新的路徑名
$data=[
'destination'=>$destination
];
//判斷錯誤號
if ($fileInfo['error']==0){
//限制檔案大小
if ($fileInfo['size']>$maxSize){
$data['msg']='上傳檔案過大';
return $data;
}
//判斷上傳檔案的型別
$ext=strtolower(pathinfo($fileInfo['name'],PATHINFO_EXTENSION));
if ($allowExt){
if (!in_array($ext,$allowExt)){
$data['msg']='非法檔案型別';
return $data;
}
}
//檢測檔案是否通過HTTP POST方法上傳
if (!is_uploaded_file($fileInfo['tmp_name'])){
$data['msg']='檔案不是通過HTTP POST方式上傳';
return $data;
}
//檢測是否為真實的圖片型別,不能單純靠副檔名
if($flag){
if (!getimagesize($fileInfo['tmp_name'])){
$data['msg']='不是真正的圖片型別';
return $data;
}
}
//指定目錄不存在時
if (!file_exists($path)){
mkdir($path,0777,true);
chmod($path,0777);
}
//防止檔名重名
$uniName=md5(uniqid(microtime(true),true));
$destination=$path.'/'.$uniName.'.'.$ext;
if (move_uploaded_file($fileInfo['tmp_name'],$destination)){
$data['msg']='檔案傳輸成功';
$data['destination']=$destination;
return $data;
}else{
$data['msg']='檔案移動失敗';
return $data;
}
}else{
switch ($fileInfo['error']){
case 1:
$msg= '上傳檔案超過了PHP配置檔案中的upload_max_filesize選項的值';
break;
case 2:
$msg= '超過了表單MAX_FILE_SIZE限制的大小';
break;
case 3:
$msg= '檔案部分被上傳';
break;
case 4:
$msg= '沒有選擇上傳檔案';
break;
case 6:
$msg= '沒有找到臨時目錄';
break;
case 7:
$msg= '檔案寫入失敗';
break;
case 8:
$msg= '系統錯誤';
break;
}
$data['msg']=$msg;
return $data;
}
}
引用:
<?php
header('content-type:text/html;charset=utf-8');
include_once 'upload.func.php';
$allowExt=array('jpeg','jpg','png','gif','wbmp');
$fileInfo=$_FILES['myFile'];
$flag=true;
$data=upload_single($fileInfo,'uploads/', 2097152,$allowExt,$flag);
echo $data['msg'];
2、多檔案上傳
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<form action="index.php" method="post" enctype="multipart/form-data">
請選擇你要上傳的檔案:<input type="file" name="myFile1"><br/>
請選擇你要上傳的檔案:<input type="file" name="myFile2"><br/>
請選擇你要上傳的檔案:<input type="file" name="myFile3"><br/>
請選擇你要上傳的檔案:<input type="file" name="myFile4"><br/>
<input type="submit" value="upload">
</form>
</body>
</html>
上傳方法檔案增加一個函式:
function getFiles(){
$i=0;
foreach ($_FILES as $file) {
if (is_string($file['name'])) {
$files[$i] = $file;
$i++;
} elseif (is_array($file['name'])) {
foreach ($file['name'] as $key => $val) {
$files[$i]['name'] = $file['name'][$key];
$files[$i]['type'] = $file['type'][$key];
$files[$i]['tmp_name'] = $file['tmp_name'][$key];
$files[$i]['error'] = $file['error'][$key];
$files[$i]['size'] = $file['size'][$key];
$i++;
}
}
}
return $files;
}
引用:
<?php
header('content-type:text/html;charset=utf-8');
include_once 'upload.func.php';
$allowExt=array('jpeg','jpg','png','gif','wbmp');
$flag=true;
foreach ($_FILES as $fileInfo){
$data=upload_single($fileInfo,'uploads/', 2097152,$allowExt,$flag);
echo $data['msg'].'<br/>';
}
六、下載
html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<a href="index.php?filename=1.jpg" ><button value="">點選下載</button></a>
</body>
</html>
php:
<?php
$filename=$_GET['filename'];
header('content-disposition:attachment;filename='.basename($filename));
header('content-length:'.filesize($filename));
readfile($filename);