php文件上傳格式
A. 怎麼用php實現文件的上傳,要求文件類型為jpg,大小不超過2m,上傳的文件存放在u
$_FILES官方文檔
你可以看看官方的$_FILES文檔,裡面有對$_FILES的內容的解釋。
想通過PHP來處理文件信息就得通過$_FILES的內容來處理,比如文件類型可以用type來判斷,要求文件類型為jpg,那就判斷if ($_FILES['file1']['type'] === 'image/jpeg'),這里的file1並不是絕對的,視情況而定。
當然如果你覺得判斷類型太麻煩,你也可以直接從name中判斷後綴名,自己將文件名分割一下就好了。大小可以用size,默認單位是位元組,不超過2M就要除以1024*1024了,可以將位元組轉換到兆位元組。
要將上傳的文件放在U目錄下,就用move_uploaded_file函數來解決,move_uploaded_file官方文檔
B. php能上傳mp4格式文件么能的話mime類型名是什麼
可以上傳mp4格式
MIME類型application/octet-stream
望採納 Thx
C. thinkphp3.2.3 怎麼上傳form表單
上傳表單
在ThinkPHP中使用上傳功能無需進行特別處理。例如,下面是一個帶有附件上傳的表單提交:
<form action="__URL__/upload" enctype="multipart/form-data" method="post" >
<input type="text" name="name" />
<input type="file" name="photo" />
<input type="submit" value="提交" >
</form>
注意,要使用上傳功能 你的表單需要設置 enctype="multipart/form-data"
多文件上傳支持
如果需要使用多個文件上傳,只需要修改表單,把
<input type='file' name='photo'>
改為
<input type='file' name='photo1'>
<input type='file' name='photo2'>
<input type='file' name='photo3'>
或者
<input type='file' name='photo[]'>
<input type='file' name='photo[]'>
<input type='file' name='photo[]'>
兩種方式的多附件上傳系統的文件上傳類都可以自動識別。
上傳操作
ThinkPHP文件上傳操作使用Think\Upload類,假設前面的表單提交到當前控制器的upload方法,我們來看下upload方法的實現代碼:
public function upload(){
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootPath = './Uploads/'; // 設置附件上傳根目錄
$upload->savePath = ''; // 設置附件上傳(子)目錄
// 上傳文件
$info = $upload->upload();
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->getError());
}else{// 上傳成功
$this->success('上傳成功!');
}
}
上傳類對圖片文件的上傳安全做了支持,如果企圖上傳非法的圖像文件,系統會提示 非法圖像文件。 為了更好的使用上傳功能,建議你的伺服器開啟finfo模塊支持
上傳參數
在上傳操作之前,我們可以對上傳的屬性進行一些設置,Upload類支持的屬性設置包括:
屬性描述
maxSize文件上傳的最大文件大小(以位元組為單位),0為不限大小
rootPath文件上傳保存的根路徑
savePath文件上傳的保存路徑(相對於根路徑)
saveName上傳文件的保存規則,支持數組和字元串方式定義
saveExt上傳文件的保存後綴,不設置的話使用原文件後綴
replace存在同名文件是否是覆蓋,默認為false
exts允許上傳的文件後綴(留空為不限制),使用數組或者逗號分隔的字元串設置,默認為空
mimes允許上傳的文件類型(留空為不限制),使用數組或者逗號分隔的字元串設置,默認為空
autoSub自動使用子目錄保存上傳文件 默認為true
subName子目錄創建方式,採用數組或者字元串方式定義
hash是否生成文件的hash編碼 默認為true
callback檢測文件是否存在回調,如果存在返迴文件信息數組
上面的屬性可以通過兩種方式傳入:
實例化傳入
我們可以在實例化的時候直接傳入參數數組,例如:
$config = array(
'maxSize' => 3145728,
'rootPath' => './Uploads/',
'savePath' => '',
'saveName' => array('uniqid',''),
'exts' => array('jpg', 'gif', 'png', 'jpeg'),
'autoSub' => true,
'subName' => array('date','Ymd'),
);
$upload = new \Think\Upload($config);// 實例化上傳類
關於saveName和subName的使用後面我們會有詳細的描述。
動態賦值
支持在實例化後動態賦值上傳參數,例如:
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize = 3145728;
$upload->rootPath = './Uploads/';
$upload->savePath = '';
$upload->saveName = array('uniqid','');
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');
$upload->autoSub = true;
$upload->subName = array('date','Ymd');
上面的設置和實例化傳入的效果是一致的。
上傳文件信息
設置好上傳的參數後,就可以調用Think\Upload類的upload方法進行附件上傳,如果失敗,返回false,並且用getError方法獲取錯誤提示信息;如果上傳成功,就返回成功上傳的文件信息數組。
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootPath = './Uploads/'; // 設置附件上傳根目錄
$upload->savePath = ''; // 設置附件上傳(子)目錄
// 上傳文件
$info = $upload->upload();
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->getError());
}else{// 上傳成功 獲取上傳文件信息
foreach($info as $file){
echo $file['savepath'].$file['savename'];
}
}
每個文件信息又是一個記錄了下面信息的數組,包括:
屬性描述
key附件上傳的表單名稱
savepath上傳文件的保存路徑
name上傳文件的原始名稱
savename上傳文件的保存名稱
size上傳文件的大小
type上傳文件的MIME類型
ext上傳文件的後綴類型
md5上傳文件的md5哈希驗證字元串 僅當hash設置開啟後有效
sha1上傳文件的sha1哈希驗證字元串 僅當hash設置開啟後有效
文件上傳成功後,就可以使用這些文件信息來進行其他的數據操作,例如保存到當前數據表或者單獨的附件數據表。
例如,下面表示把上傳信息保存到數據表的欄位:
$model = M('Photo');
// 取得成功上傳的文件信息
$info = $upload->upload();
// 保存當前數據對象
$data['photo'] = $info[0]['savename'];
$data['create_time'] = NOW_TIME;
$model->add($data);
單文件上傳
upload方法支持多文件上傳,有時候,我們只需要上傳一個文件,就可以使用Upload類提供的uploadOne方法上傳單個文件,例如:
public function upload(){
$upload = new \Think\Upload();// 實例化上傳類
$upload->maxSize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootPath = './Uploads/'; // 設置附件上傳根目錄
// 上傳單個文件
$info = $upload->uploadOne($_FILES['photo1']);
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->getError());
}else{// 上傳成功 獲取上傳文件信息
echo $info['savepath'].$info['savename'];
}
}
uploadOne方法上傳成功後返回的文件信息和upload方法的區別是只有單個文件信息的一維數組。
上傳文件的命名規則
上傳文件的命名規則(saveName)用於確保文件不會產生沖突或者覆蓋的情況。命名規則的定義可以根據你的業務邏輯來調整,不是固定的。例如,如果你採用時間戳的方式來定義命名規范,那麼在同時上傳多個文件的時候可能產生沖突(因為同一秒內可以上傳多個文件),因此你需要根據你的業務需求來設置合適的上傳命名規則。這里順便來說下saveName參數的具體用法。
一、採用函數方式
如果傳入的字元串是一個函數名,那麼表示採用函數動態生成上傳文件名(不包括文件後綴),例如:
// 採用時間戳命名
$upload->saveName = 'time';
// 採用GUID序列命名
$upload->saveName = 'com_create_guid';
也可以採用用戶自定義函數
// 採用自定義函數命名
$upload->saveName = 'myfun';
默認的命名規則設置是採用uniqid函數生成一個唯一的字元串序列。
saveName的值支持數組和字元串兩種方式,如果是只有一個參數或者沒有參數的函數,直接使用字元串設置即可,如果需要傳入額外的參數,可以使用數組方式,例如:
// 採用date函數生成命名規則 傳入Y-m-d參數
$upload->saveName = array('date','Y-m-d');
// 如果有多個參數需要傳入的話 可以使用數組
$upload->saveName = array('myFun',array('__FILE__','val1','val2'));
如果需要使用上傳的原始文件名,可以採用__FILE__傳入,所以上面的定義規則,最終的結果是 myFun('上傳文件名','val1','val2')執行的結果。
二、直接設置上傳文件名
如果傳入的參數不是一個函數名,那麼就會直接當做是上傳文件名,例如:
$upload->saveName = time().'_'.mt_rand();
表示上傳的文件命名採用時間戳加一個隨機數的組合字元串方式。
當然,如果覺得有必要,你還可以固定設置一個上傳文件的命名規則,用於固定保存某個上傳文件。
$upload->saveName = 'ThinkPHP';
三、保持上傳文件名不變
如果你想保持上傳的文件名不變,那麼只需要設置命名規范為空即可,例如:
$upload->saveName = '';
一般來說不建議保持不變,因為會導致相同的文件名上傳後被覆蓋的情況。
子目錄保存
saveName只是用於設置文件的保存規則,不涉及到目錄,如果希望對上傳的文件分子目錄保存,可以設置autoSub和subName參數來完成,例如:
// 開啟子目錄保存 並以日期(格式為Ymd)為子目錄
$upload->autoSub = true;
$upload->subName = array('date','Ymd');
可以使用自定義函數來保存,例如:
// 開啟子目錄保存 並調用自定義函數get_user_id生成子目錄
$upload->autoSub = true;
$upload->subName = 'get_user_id';
和saveName參數一樣,subName的定義可以採用數組和字元串的方式。
注意:如果get_user_id函數未定義的話,會直接以get_user_id字元串作為子目錄的名稱保存。
子目錄保存和文件命名規則可以結合使用。
上傳驅動
上傳類可以支持不同的環境,通過相應的上傳驅動來解決,默認情況下使用本地(Local)上傳驅動,當然,你還可以設置當前默認的上傳驅動類型,例如:
'FILE_UPLOAD_TYPE' => 'ftp',
'UPLOAD_TYPE_CONFIG' => array(
'host' => '192.168.1.200', //伺服器
'port' => 21, //埠
'timeout' => 90, //超時時間
'username' => 'ftp_user', //用戶名
'password' => 'ftp_pwd', //密碼 ),
表示當前使用Ftp作為上傳類的驅動,上傳的文件會通過FTP傳到指定的遠程伺服器。
也可以在實例化上傳類的時候指定,例如:
$config = array(
'maxSize' = 3145728,
'rootPath' = './Uploads/',
'savePath' = '',
'saveName' = array('uniqid',''),
'exts' = array('jpg', 'gif', 'png', 'jpeg'),
'autoSub' = true,
'subName' = array('date','Ymd'),
);
$ftpConfig = array(
'host' => '192.168.1.200', //伺服器
'port' => 21, //埠
'timeout' => 90, //超時時間
'username' => 'ftp_user', //用戶名
'password' => 'ftp_pwd', //密碼 );
$upload = new \Think\Upload($config,'Ftp',$ftpConfig);// 實例化上傳類
目前已經支持的上傳驅動包括Local、Ftp、Sae、Bcs、七牛和又拍雲等。
D. PHP文件上傳代碼用法
php文件上傳代碼編寫過程
先判斷是否上傳文件
如果有再來判斷上傳中是否出錯
如果出錯 則提示出錯信息
如查沒出錯 再判斷文件類型
如果類型符合條件 再判斷指定目錄中有沒有存在該文件
如果沒有就把該文件移至指定目錄
在php中上傳文件必須知道的幾個東西
$_FILES[ myfile ][ name ] 是指被上傳文件的名稱
$_FILES[ myfile ][ type ] 是指被上傳文件的類型
$_FILES[ myfile ][ size ] 是指被上傳文件的大小 單位為位元組(B)
$_FILES[ myfile ][ tmp_name ] 是指被上傳文件存在伺服器中的臨時副本文件名稱 文件被移動到指定目錄後臨文件將被自動消毀
$_FILES[ myfile ]["error"] 是指由文件上傳中有可能出現的錯誤的狀態碼 關於各狀態含義後在會說明
先來看一下HTML部分
代碼如下 復制代碼?<form action="upload php" method="post" enctype="multipart/form data"> 上傳 <input type=file name=myfile /> <input type=submit name=submit value="上傳" /> </form>
說明
form標答的action="upload php"是指點擊這個form中的submit的時候 這個上傳命令會被發送到這個叫 upload php的頁面去處理 method="post"是指以post方式去送 enctype="multipart/form data"屬性規定了在提交這個表單時要使用哪種內容類型 在表單需要二進制數據時 比如文件內容 請使用"multipart/form data" 如果要上傳文件 這個屬性是必要的 input中的type="file"時 規定了應該把輸入作為文件來處理 並且在input後面會有一個瀏覽的按鈕
我們再來看一個PHP處理頁面 upload php
代碼如下 復制代碼<?php if($_FILES[ myfile ][ name ] != ) { if($_FILES[ myfile ][ error ] > ) { echo "錯誤狀態 " $_FILES[ myfile ][ error ]; } else { move_uploaded_file($_FILES[ myfile ][ tmp_name ] "uploads/" $FILES[ myfile ][ name ]); echo "<script>alert(上傳成功!);</script>"; } } else{ echo "<script>alert(請上傳文件!);</script>"; } ?>
上面超級簡單 我們現在來升級一下
upload php
代碼如下 復制代碼<!DOCTYPE HTML PUBLIC " //W C//DTD HTML Transitional//EN"> <> <head> <title>ddd</title> <meta equiv="content type" content="text/; charset=UTF "> </head> <body> <! 文件上傳要注意: 要有enctyp method="post" > <form enctype="multipart/form data" action="uploadProcess php" method="post" > <table> <tr><td>請填寫用戶名</td><td><input type=text name=username></td></tr> <tr><td>請簡單介紹文件</td><td><textarea rows=" " cols=" " name=fileintro class="page_speeder_734321457"></textarea></td></tr> <tr><td>請上傳你的文件</td><td><input type=file name=myfile></td></tr> <tr><td colspan=" "><input type=submit value="上傳"><td></tr> </table> </form> </body> </>
uploadProcess php
代碼如下 復制代碼<?php
//接收 $username=$_POST[ username ]; $fileintro=$_POST[ fileintro ]; //echo $username $fileintro; //獲取文件信息 /* echo "<pre>"; print_r($_FILES); echo "</pre>"; */ //獲取文件的大小 $file_size=$_FILES[ myfile ][ size ]; if($file_size> * * ){ echo "<script type= text/javascript >window alert( 文件不能大於 M )</script>"; exit(); }
//獲取文件類型 $file_type=$_FILES[ myfile ][ type ]; if($file_type!="image/jpeg" && $file_type!="image/pjpeg"){ echo "文件類型只能是 jpg 格式"; exit(); }
//判斷上傳是否OK if(is_uploaded_file($_FILES[ myfile ][ tmp_name ])){ //得到上傳的文件 轉存到你希望的目錄 $upload_file=$_FILES[ myfile ][ tmp_name ]; //防止圖片覆蓋問題 為每個用戶建立一個文件夾 $user_path=$_SERVER[ DOCUMENT_ROOT ] "/file/up/" $username; if(!file_exists($user_path)){ mkdir ($user_path); }
//$move_to_file=$user_path "/" $_FILES[ myfile ][ name ]; //防止用戶上傳用戶名相同的問題 $file_true_name=$_FILES[ myfile ][ name ]; $move_to_file=$user_path "/" time() rand( ) substr($file_true_name strripos($file_true_name " "));
//echo $upload_file $move_to_file; //中文要轉碼 if(move_uploaded_file($upload_file iconv("utf " "gb " "$move_to_file"))){ echo $_FILES[ myfile ][ name ] "上傳成功"; }else{ echo "上傳失敗"; } }else{ echo "上傳失敗"; }
?>
注意:
我舉個例子大家就知道 比如一個圖片文件 pic jpg 我們用 strrchr處理 strrchr(pic jpg ) 它將返回 jpg 明白了嗎?該函數返回指定字元在該字元串最後出現的位置後的字元 配合 substr() 我們就可以取到jpg 這樣我們就得到了文件的後綴名 來判斷上傳文件是否符合指定格式 本程序把指定的格式放在一個數組中 實際使用時可根據需要添加
lishixin/Article/program/PHP/201311/20924
E. 經典怎樣通過php將本地的文件上傳到伺服器上
創建一個文件上傳表單
允許用戶從表單上傳文件是非常有用的。
請看下面這個供上傳文件的 HTML 表單:
<html>
<body>
<form action="upload_file.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
請留意如下有關此表單的信息:
<form> 標簽的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
<input> 標簽的 type="file" 屬性規定了應該把輸入作為文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
注釋:允許用戶上傳文件是一個巨大的安全風險。請僅僅允許可信的用戶執行文件上傳操作。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程伺服器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name", "type", "size", "tmp_name" 或 "error"。就像這樣:
$_FILES["file"]["name"] - 被上傳文件的名稱
$_FILES["file"]["type"] - 被上傳文件的類型
$_FILES["file"]["size"] - 被上傳文件的大小,以位元組計
$_FILES["file"]["tmp_name"] - 存儲在伺服器的文件的臨時副本的名稱
$_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
這是一種非常簡單文件上傳方式。基於安全方面的考慮,您應當增加有關什麼用戶有權上傳文件的限制。
上傳限制
在這個腳本中,我們增加了對文件上傳的限制。用戶只能上傳 .gif 或 .jpeg 文件,文件大小必須小於 20 kb:
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "Invalid file";
}
?>
注釋:對於 IE,識別 jpg 文件的類型必須是 pjpeg,對於 FireFox,必須是 jpeg。
保存被上傳的文件
上面的例子在伺服器的 PHP 臨時文件夾創建了一個被上傳文件的臨時副本。
這個臨時的復制文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>
上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。
F. 如何使用php中ftp函數上傳文件以及解決上傳文件失敗的方法
因為系統重構實現均衡負載,網站程序與文件伺服器不在一台機子上。於是,程序在上傳文件的同時就要將文件上傳到文件伺服器上。
這里涉及到windows主機上傳到linux主機,linux主機上傳到linux主機。這兩個之間呢,只是稍微的有點區別,因為windows的路徑可以兼容linux路徑,但是linux的路徑不兼容windows主機'\\'的寫法。所以,在寫路徑的時候稍加註意即可。
下面,就列舉上面兩種情況php中使用ftp函數上傳文件的具體實現代碼。
一、 ftp上傳圖片參數說明。
$source:本機圖片完整的路徑。(/a/b/c.jpg)
$des :上傳目標linux主機完整的路徑。
$ftp_server:ftp地址
$ftp_user_name:ftp用戶名
$ftp_user_pass: ftp密碼
$port:埠
二、如何使用php中ftp函數上傳文件的方法
例如:
本地地址為:/a/b/c.jpg
目標地址為:/d/a/b/c.jpg
2.1、linux主機上傳linux主機。
function ftpSendFile($source,$des,$ftp_server,$ftp_user_name,$ftp_user_pass,$port)
{
// 此步驟是在於上傳目錄與本機的目錄不一致轉換使用
$des = "/d" . $des;
$conn_id = ftp_connect($ftp_server, $port) or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, TRUE);
$ftp_folder = dirname($des);
$dir = explode("/", $ftp_folder);
$path = "";
for ($i = 0; $i < count($dir); $i++) {
$path .= "/" . $dir[$i];
if (!ftp_chdir($conn_id, $path)) {
$result = ftp_mkdir($conn_id, $path);
}
}
if (ftp_put($conn_id, $des, $source, FTP_BINARY)) {
return 1;
} else {
return 0;
}
ftp_close($conn_id);
}
2、windows主機上傳linux主機。
function sendPic($source,$des,$ftp_server,$ftp_user_name,$ftp_user_pass,$port)
{
$des = "/d" . $des;
$conn_id = ftp_connect($ftp_server, $port) or die("Couldn't connect to $ftp_server");
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
ftp_pasv($conn_id, TRUE);
$ftp_folder = dirname(str_ireplace('\\', '/', $des));
$dir = explode("/", $ftp_folder);
$path = "";
for ($i = 0; $i < count($dir); $i++) {
$path .= "/" . $dir[$i];
if (!ftp_chdir($conn_id, $path)) {
$result = ftp_mkdir($conn_id, $path);
}
}
if (ftp_put($conn_id, str_ireplace('\\', '/', $des), $source, FTP_BINARY)) {
return 1;
} else {
return 0;
}
ftp_close($conn_id);
}
上面的兩種使用php中ftp函數上傳文件的方法基本可以滿足正常的使用。