通過 PHP,可以把文件上傳到服務器。
本章節實例在 test 項目下完成,目錄結構為:
test |-----upload # 文件上傳的目錄 |-----form.html # 表單文件 |-----upload_file.php # php 上傳代碼
創建一個文件上傳表單
允許用戶從表單上傳文件是非常有用的。
請看下面這個供上傳文件的 HTML 表單:
<html> <head> <meta charset="utf-8"> <title>XIONGT(XIONGT.com)</title> </head> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">文件名:</label> <input type="file" name="file" id="file"><br> <input type="submit" name="submit" value="提交"> </form> </body> </html>
將以上代碼保存到 form.html 文件中。
有關上面的 HTML 表單的一些注意項列舉如下:
注釋:允許用戶上傳文件是一個巨大的安全風險。請僅僅允許可信的用戶執行文件上傳操作。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
<?php if ($_FILES["file"]["error"] > 0) { echo "錯誤:" . $_FILES["file"]["error"] . "<br>"; } else { echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件類型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"]; } ?>
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
這是一種非常簡單文件上傳方式。基于安全方面的考慮,您應當增加有關允許哪些用戶上傳文件的限制。
上傳限制
在這個腳本中,我們增加了對文件上傳的限制。用戶只能上傳 .gif、.jpeg、.jpg、.png 文件,文件大小必須小于 200 kB:
<?php // 允許上傳的圖片后綴 $allowedExts=array("gif", "jpeg", "jpg", "png"); $temp=explode(".", $_FILES["file"]["name"]); $extension=end($temp); // 獲取文件后綴名 if ((($_FILES["file"]["type"]=="image/gif") || ($_FILES["file"]["type"]=="image/jpeg") || ($_FILES["file"]["type"]=="image/jpg") || ($_FILES["file"]["type"]=="image/pjpeg") || ($_FILES["file"]["type"]=="image/x-png") || ($_FILES["file"]["type"]=="image/png")) && ($_FILES["file"]["size"] < 204800) // 小于 200 kb && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "錯誤:: " . $_FILES["file"]["error"] . "<br>"; } else { echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件類型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"]; } } else { echo "非法的文件格式"; } ?>
保存被上傳的文件
上面的實例在服務器的 PHP 臨時文件夾中創建了一個被上傳文件的臨時副本。
這個臨時的副本文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
<?php // 允許上傳的圖片后綴 $allowedExts=array("gif", "jpeg", "jpg", "png"); $temp=explode(".", $_FILES["file"]["name"]); echo $_FILES["file"]["size"]; $extension=end($temp); // 獲取文件后綴名 if ((($_FILES["file"]["type"]=="image/gif") || ($_FILES["file"]["type"]=="image/jpeg") || ($_FILES["file"]["type"]=="image/jpg") || ($_FILES["file"]["type"]=="image/pjpeg") || ($_FILES["file"]["type"]=="image/x-png") || ($_FILES["file"]["type"]=="image/png")) && ($_FILES["file"]["size"] < 204800) // 小于 200 kb && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "錯誤:: " . $_FILES["file"]["error"] . "<br>"; } else { echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>"; echo "文件類型: " . $_FILES["file"]["type"] . "<br>"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>"; echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"] . "<br>"; // 判斷當期目錄下的 upload 目錄是否存在該文件 // 如果沒有 upload 目錄,你需要創建它,upload 目錄權限為 777 if (file_exists("upload/" . $_FILES["file"]["name"])) { echo $_FILES["file"]["name"] . " 文件已經存在。 "; } else { // 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下 move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]); echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"]; } } } else { echo "非法的文件格式"; } ?>
上面的腳本檢測了文件是否已存在,如果不存在,則把文件拷貝到名為 "upload" 的目錄下。
、PHP配置文件中和上傳文件有關的選項
file_uploads=on 設置php腳本是否可以接受HTTP文件上傳
memory_limit=8M 設置腳本可以分配的最大內存量, 防止失控的腳本獨占服務器內存
upload_max_filesize=200M 限制php處理上傳文件大小的最大值, 此值必須小于post_max_size的值
最大不要超過服務器的內存
upload_tmp_dir=c:/uploads/ 上傳文件存放的臨時路徑(默認值:使用操作系統的臨時目錄), 該臨時文件的有效期就是腳本周期:
post_max_size=250M 限制通過post方法可以接受信息的最大值
此值除了包含上傳文件的大小, 還包含表單中的數據, 因此此值必須大于upload_max_filesize
限制文件上傳的兩個參數:
post_max_size=150M
upload_max_filesize=100M
post_max_size 必須大于 upload_max_filesize
max_execution_time PHP執行的最大時間
max_input_time php 解析post/get數據所用的最大時間
如何獲取服務器能夠上傳的文件大小
<?php
function get_upload_max_size(){
return min(intval(get_cfg_var('upload_max_filesize')),intval(get_cfg_var('post_max_size')),intval(get_cfg_var('memory_limit')));
}
echo get_upload_max_size(); //3200M
二、上傳表單需要的注意事項
1. 如果有文件上傳操作表單的提交方法必須 HTTP post
2. 表單上傳需要使用type為file的表
3. enctype="multipart/form-data" 只有文件上傳時才使用這個值, 用來指定表單編碼的數據方式, 讓服務器知道, 我們要傳遞
一個文件并帶有常規的表單信息。
4. 建議添加一個 MAX_FILE_SIZE 隱藏表單, 值的單位也是字節
<input type="hidden" name="MAX_FILE_SIZE" value="1000000" />
三、PHP處理上傳的數據
$_POST 接收非上傳的數據
如果是文件上傳的數據則使用 $_FILES處理上傳的文件
<?php
//step 1 使用$_FILES['pic']["error"] 檢查錯誤
if($_FILES["pic"]["error"] > 0){
switch($_FILES["pic"]["error"]) {
case 1:
echo "上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值<br>";
break;
case 2:
echo "上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值";
break;
case 3:
echo "文件只有部分被上傳";
break;
case 4:
echo "沒有文件被上傳";
break;
default:
echo "末知錯誤";
}
exit;
}
$maxsize=5000000; //50k
//step 2 使用$_FILES["pic"]["size"] 限制大小 單位字節 2M=2000000
if($_FILES["pic"]["size"] > $maxsize ) {
echo "上傳的文件太大,不能超過{$maxsize}字節";
exit;
}
//step 3 使用$_FILES["pic"]["type"]或是文件的擴展名 限制類型 MIME image/gif image/png gif png jpg
/* list($dl, $xl)=explode("/", $_FILES["pic"]["type"]);
if($dl!="image"){
echo "請上傳一個圖片,不充許其它類型文件";
exit;
}
*/
//$hz=strrchr($_FILES["pic"]["type"], "."); 后綴名含有"."
$allowtype=array("png", "gif", "jpg", "jpeg");
$arr=explode(".", $_FILES["pic"]["name"]);
$hz=$arr[count($arr)-1];
if(!in_array($hz, $allowtype)){
echo "這是不充許的類型";
exit;
}
//step 4 將讓傳后的文件名改名
$filepath="./uploads/"; //文件上傳不要采用根路徑 $filepath="/uploads/", 否則會報錯
$randname=date("Y").date("m").date("d").date("H").date("i").date("s").rand(100, 999).".".$hz;
//將臨時位置的文件移動到指定的目錄上即可
if(is_uploaded_file($_FILES["pic"]["tmp_name"])){
if(move_uploaded_file($_FILES["pic"]["tmp_name"], $filepath.$randname)){
echo "上傳成功";
}else{
echo "上傳失敗";
}
}else{
echo "不是一個上傳文件";
}
多文件上傳結構
多個文件上傳后$_FILES 數組結構圖
Array(
[myfile]=>Array(
[name]=>Array( //$_FILES["myfile"]["name"]存儲所有上傳文件的內容
[0]=>Rav.ini //$_FILES["myfile"]["name"][0]第一個上傳文件的名稱
[1]=>msgsocm.log //$_FILES["myfile"]["name"][1]第二個上傳文件的名稱
[2]=>NOTEPAD.EXE) //$_FILES["myfile"]["name"][2]第三個上傳文件的名稱
[type]=>Array( //$_FILES["myfile"]["type"]存儲所有上傳文件的類型
[0]=>application/octet-stream //$_FILES["myfile"]["type"][0]第一個上傳文件的類型
[1]=>application/octet-stream //$_FILES["myfile"]["type"][1]第二個上傳文件的類型
[2]=>application/octet-stream) //$_FILES["myfile"]["type"][2]第三個上傳文件的類型
[tmp_name]=>Array(
[0]=>C:/WINDOWS/Temp/phpAF.tmp
[1]=>C:/WINDOWS/Temp/phpB0.tmp
[2]=>C:/WINDOWS/Temp/phpB1.tmp)
[error]=>Array(
[0]=>0
[1]=>0
[2]=>0)
[size]=>Array(
[0]=>64
[1]=>1350
[2]=>66560))
)
實例:
<html>
<head>
<meta charset="utf-8">
<title>index_uploads</title>
</head>
<body>
<form action="uploads.php" method="post" enctype="multipart/form-data">
<input type="file" name="file[]">
<br>
<input type="file" name="file[]">
<br>
<input type="submit" value="uploads">
</form>
</body>
</html>
<?php
header("content-type:text/html;charset=utf-8");
echo "<pre>";
print_r($_FILES);
echo "</pre>";
$count=count($_FILES['file']['name']);
for ($i=0; $i < $count; $i++) {
$tmpfile=$_FILES['file']['tmp_name'][$i];
$filefix=array_pop(explode(".", $_FILES['file']['name'][$i]));
$dstfile="uploads/files/".time()."_".mt_rand().".".$filefix;
if (move_uploaded_file($tmpfile, $dstfile)) {
echo "<script>alert('succeed!');window.location.href='index_uploads.php';</script>";
} else {
echo "<script>alert('fail!');window.location.href='index_uploads.php';</script>";
}
}
?>
相關函數
is_uploaded_file() 判斷文件是否是通過 HTTP POST 上傳的
bool is_uploaded_file ( string $filename )
move_uploaded_file() 將上傳的文件移動到新位置
bool move_uploaded_file ( string $filename , string $destination )
$filename $_FILES["name"]["tmp_name"]
$destination 移動文件到這個位置(包含文件的路徑和文件名)
注意: 上傳文件的腳本的所有者一定要有"w"的權限;
大文件上傳時延長上傳時間:
@set_time_limit(0);
新建表單
<form action='deal.php' method='post' enctype='multipart/form-data'>
選擇頭像:<input type='file' name='file' />
<hr />
<input type='submit' name='submit' value='上傳' />
</form>
deal.php
<?php
//1、設置響應頭信息
header('Content-type:text/html; charset=utf-8');
//2、獲取上傳文件信息
if($_FILES['file']['size'] > 0) {
$file=$_FILES['file']['name'];
$filename=getRandName($file);
//3、把臨時文件上傳到uploads文件夾下(move_uploaded_file函數)
if(move_uploaded_file($_FILES['file']['tmp_name'],'uploads/'.$filename)) {
echo '上傳成功';
} else {
echo '上傳失敗';
}
}
//定義一個函數,用于獲取隨機文件
function getRandName($file) {
//定義一個變量,用于接收新名稱
$newname=date('YmdHis');
//定義一個字符串
$str='abcdefghijklmnopqrstuvwxyz';
//隨機取出其中6個字符
for($i=0;$i<6;$i++) {
$newname .=$str[mt_rand(0,strlen($str)-1)];
}
//返回生成后的新文件名稱
return $newname . strrchr($file,'.');
}
?>
多維$_FILES['uploadFile']數組進行轉換
foreach($_FILES['uploadFile'] as $k=>$v){
foreach($v as $key=>$value){
if($key==$key){
$arr[$key][$k]=$value;
}
}
}
echo "<pre>";
print_r($arr);
echo "</pre>";
原數組的格式
Array
(
[name]=> Array
(
[0]=> laravel框架.txt
[1]=> ecshop分析.txt
[2]=> 注釋.txt
)
[type]=> Array
(
[0]=> text/plain
[1]=> text/plain
[2]=> text/plain
)
[tmp_name]=> Array
(
[0]=> C:\Windows\php562C.tmp
[1]=> C:\Windows\php562D.tmp
[2]=> C:\Windows\php563E.tmp
)
[error]=> Array
(
[0]=> 0
[1]=> 0
[2]=> 0
)
[size]=> Array
(
[0]=> 12506
[1]=> 138
[2]=> 2094
)
)
轉換后數組格式:
TML5 文件上傳下載的實例代碼,WEBUPLOADER之大文件分段上傳、斷點續傳,HTML DOM INPUT FILE 大文件上傳源代碼,B/S大附件上傳,支持斷點續傳,VUE處理文件流實現上傳下載,VUE 上傳大型文件插件(VUE上傳視頻插件)
之前在網上也搜索過相關的資料,在論壇里面也與網絡交流過,但是給出的方案都不太令人滿意。一方面論壇里面的網頁都沒有真實的項目經驗。幾乎大部分的網頁都是在紙上談兵,很多問題完全是憑想象在回答。也不能夠提供真實案例,基本上都沒有項目的實戰經驗。
甚至有些學生也在里面不知道從哪里復制的一些代碼然后粘貼在上面。
后端PHP5,PHP6,PHP7,PHP8,ThinkPHP,
服務器支持Linux,Windows,macOS,CentOS,中標麒麟,銀河麒麟,統信,龍芯,華為鯤鵬,
數據庫支持MySQL,達夢數據庫,人大金倉
需要提供前端源碼,后端源碼,控件源碼
需要提供7*24小時技術支持,長期技術支持,長期維護服務
需要提供手機,QQ,微信,企業微信,電子郵箱等聯系方式
需要支持包含IE在內的全部瀏覽器
終端需要支持Windows,macOS,Linux,信創國產化環境,中標麒麟,銀河麒麟,統信UOS,龍芯,華為
功能需要支持10G,50G,100G大文件上傳和斷點續傳,刷新續傳,重啟續傳
文件夾包含1W,10W,100W個文件和層級結構
支持超大文件分片,分段,分塊,分割上傳下載,斷點續傳
支持文件夾上傳,下載斷點續傳,支持文件夾層級結構,層級結構信息保存到數據庫,下載的時候同樣保留層級結構
支持加密上傳,下載加密,端到端加密,國密SM4加密算法,數據加密傳輸,傳輸過程中要保證數據是加密的。1.下載示例
https://gitee.com/xproer/up6-vue-cli
將up6組件復制到項目中
示例中已經包含此目錄
1.引入up6組件
2.配置接口地址
接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表
參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de
3.處理事件
啟動測試
啟動成功
效果
數據庫
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
*請認真填寫需求信息,我們會在24小時內與您取得聯系。