php上傳文件原理
㈠ 如何使用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函數上傳文件的方法基本可以滿足正常的使用。
㈡ html中input上傳圖片什麼原理啊php後台怎麼處理如果用ajax的話是傳些什麼
用input上傳圖片是把圖片作為文件傳輸的,在php後台中使用 $_FILES來接收。
注意:前端的form表單除了action ,method 屬性外,還要添加一個'enctype'屬性,否則文件傳輸不成功。
<form enctype="multipart/form-data">
<input type="file" >
</form>
$_FILES接收信息 有幾個屬性:
name , 上傳的文件名稱
size ,上傳的文件大小
tmp_name ,臨時路徑
type ,文件類型
error錯誤提示
error取值說明:
( 0:沒問題。1/2:大小超過限制[1->超出php.ini限制。2->超出文件域max_file限制]。3:只上傳部分附件(不好測試)。4:沒有上傳附件)
有上傳信息時:$_FILES接收到的附件信息:
保存附件:把上傳的文件由臨時路徑保存到真實的圖片存儲的位置。
move_uploaded_file(臨時路徑名附件,真實路徑名附件)
㈢ php如何實現文件上傳
所謂上傳就是把文件從你電腦本地復制到你的項目指定文件夾下。
但這有個中間過程,就是復制到系統指定的臨時文件夾生成臨時文件。
然後將臨時文件復制到你指定的文件夾下。
剩下的就是各種驗證了。
給你個圖片上傳方法
//上傳一張圖片
$pic = $_FILES['pic'];
function upload($pic){
$tmp_name = $pic['tmp_name'];
$name = $pic['name'];
$type = $pic['type'];
$size = $pic['size'];
if(!is_uploaded_file($tmp_name)) exit('不是上傳文件');
//判斷是否是圖片
$mine = array('image/png','image/jpg','image/gif','image/jpeg');
if(!in_array($type,$mine)) exit('圖片格式不正確');
//判斷是否有錯誤碼
$error = $pic['error'];
switch ($error) {
case 1:
exit("超出上傳文件的最大限制");
case 2:
exit("超出了指定的文件大小");
case 3:
exit("只有部分文件被上傳");
case 4:
exit("文件沒有被上傳");
case 6:
exit("找不到臨時文件夾");
case 7:
exit("文件寫入失敗");
}
echo "================<br/>";
echo "上傳文件名稱是:".$name."<br/>";
echo "上傳文件類型是:".$type."<br/>";
echo "上傳文件大小是:".$size."<br/>";
echo "上傳後系統返回的值是:".$error."<br/>";
echo "上傳文件的臨時存放路徑是:".$tmp_name."<br/>";
echo"開始移動臨時文件".'<br>';
$des_name = 'up/'.mt_rand().time().'.'.basename($type);
$res = move_uploaded_file($tmp_name, $des_name);
if($res){
echo "================<br/>";
echo "上傳圖片成功".'<br>';
}
}
㈣ phpcms鍓嶅彴鎬庝箞涓婁紶鏂囦歡php濡備綍瀹炵幇鏂囦歡涓婁紶鍔熻兘
phpcmsv9濡備綍涓婁紶鏂囩珷
phpcmsv9娓稿㈠湪鍚庡彴鍙戝竷鏂囩珷錛屾病鏈変笂浼犻檮浠剁殑鍔熻兘銆娓稿㈠彂甯冩枃絝狅紝鍚庢潵鍙戠幇娓稿㈠浘鐗囦笂浼犱笉浜嗐傛病鏈夐檮浠朵笂浼犲姛鑳斤紝鍚庡彴璁劇疆涓哄厑璁告父瀹涓婁紶闄勪歡銆傜粨鏋滆繕鏄涓嶈屻傞櫎浜嗕慨鏀圭▼搴忥紝娌℃湁鍒鐨勫姙娉曘傝ユ柟娉曞備笅:
phpcms鍐呭硅彶灝斿吂緙栬緫form.inc.php
鍙戠幇
娉ㄩ噴鎺夛紝//$allowupload=defined(IN_ADMINallowattachment
put$allowupload=1錛//榪愯岃塊棶鑰呬笂浼犻檮浠
榪欏厑璁告瘡涓浜轟笂浼犻檮浠躲
浣嗘槸鏈変竴涓闂棰樸
浣犲彲浠ヤ笂浼犱箣鍚庯紝閲岄潰榪樻湁鍥懼簱鍜屾枃浠舵祻瑙堛傛垜涓嶆兂璁╃敤鎴風湅鍒板埆浜虹殑鍥劇墖錛屾墍浠ュ湪榪欓噷淇鏀瑰備笅:
phpcms闄勪歡妯℃澘swfupload.tpl.php
鍔犳敞閲
Tab_swf_3鍜4閮ㄥ垎灝卞熶簡銆
鍘誨仛鍚с傚ソ浜嗭紝浣犲畬鎴愪簡銆
cms2.0鐢佃剳涓婃庝箞璁劇疆錛
1銆佹墍鏈夋ā鏉挎柟妗堥兘淇濆瓨鍦./phpcms/templates/鐩褰曚笅錛堝傛灉闇瑕佸湪綰誇慨鏀癸紝璇烽氳繃ftp灝嗚ョ洰褰曡劇疆涓777錛屽苟搴旂敤鍒板瓙鐩褰曪級
2銆佺綉絝欏綋鍓嶄嬌鐢ㄧ殑妯℃澘鏂規堜負錛氶粯璁ゆā鏉匡紝淇濆瓨璺寰勪負錛./phpcms/templates/default/錛屽叾浠栨ā鏉挎柟妗堢殑鍙樺寲涓嶄細褰卞搷緗戠珯鍓嶅彴鐨勬樉紺恆
3銆佸傛灉闇瑕佸炲姞緗戠珯妯℃澘鏂規堬紝璇鋒妸鏂扮殑妯℃澘鏂規堜笂浼犺嚦./phpcms/templates/鐩褰
4銆佸傛灉闇瑕佸簲鐢ㄦ柊鐨勭綉絝欐ā鏉挎柟妗堬紝璇鋒妸璇ユā鏉挎柟妗堣劇疆涓虹郴緇熼粯璁ゆ柟妗堛
cms鏁版嵁搴撴庝箞璁劇疆錛
鍦‵TP涓鍙浠ヤ慨鏀圭殑銆
鍏蜂綋鐨勬ラわ細
鐧誨綍FTP鎵懼埌浣犵殑鍩熷悕鐨勬枃浠跺す錛
鎵撳紑e/錛屾帴鐫鎵撳紑config/錛
鍦ㄩ噷闈㈢殑config.php涓鍙浠ヤ慨鏀癸紝灝辨槸錛堜綘鐨勫煙鍚/e/config/config.php錛夎繖涓灝辨槸CMS鐨勬暟鎹搴撻厤緗鏂囦歡錛
siteservercms鎬庝箞瀹夎呭晩錛熸垜浼犵殑瀹夎呬笉浜嗗晩錛
棣栧厛鍦ㄦ湰鍦扮數鑴戜笂瑙e帇錛岃В鍘嬪嚭鏉ヤ袱涓鏂囦歡錛歩nstall_package鍜宺eadme,鐢╢tp杞浠跺皢install_package鏂囦歡澶圭殑鎵鏈夋枃浠跺叏閮ㄤ笂浼犺嚦絀洪棿錛岀劧鍚庣洿鎺ュ湪嫻忚堝櫒璁塊棶浣犵殑鍩熷悕錛屾垨鍦ㄦ祻瑙堝櫒杈撳叆浣犵殑鍩熷悕/install/install.php,鍗沖彲鐪嬪埌瀹夎呯晫闈錛屽傛灉浣犱笉鐔熸倝鐨勫彲閫夋嫨鍏ㄦ柊瀹夎咃紝涓鐩寸偣鍑諱笅涓姝ワ紝杈撳叆浣犵殑鏁版嵁搴撳悕縐般佸瘑鐮侊紝鍙婄$悊鍛樼數瀛愰偖綆憋紝鍗沖彲瀹夎呮垚鍔熴
㈤ 經典怎樣通過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";
}
?>
上面的腳本檢測了是否已存在此文件,如果不存在,則把文件拷貝到指定的文件夾。
㈥ 求實現php文件上傳代碼
PHP上傳文件非常簡單,你需要一個上傳的HTML文件(<FORM>),一個保存文件的PHP文件(保存),一個查詢上傳文件清單的工具。
真正實現完整功能的上傳和管理需要使用資料庫,我的網站俱樂部裡面上傳文件一開放很快就傳了幾萬個文件。
最簡單的方法不用資料庫,可以用一個PHP文件實現,這個文件列出指定目錄下的所有文件,然後提供一個上傳的FORM,最後檢測是否提交了FORM數據,是就保存文件到指定位置。
PHP手冊第39章有關於處理這些問題的說明,我復制粘貼如下:
上一頁V.特點下一頁
--------------------------------------------------------------------------------
第39章文件上傳處理
目錄
POST方法上傳
錯誤信息說明
常見缺陷
上傳多個文件
對PUT方法的支持
POST方法上傳
本特性可以使用戶上傳文本和二進制文件。用PHP的認證和文件操作函數,可以完全控制允許哪些人上傳以及文件上傳後怎樣處理。
PHP能夠接受任何來自符合RFC-1867標準的瀏覽器(包括NetscapeNavigator3及更高版本,打了補丁的MicrosoftInternetExplorer3或者更高版本)上傳的文件。
相關的設置:請參閱php.ini的file_uploads,upload_max_filesize,upload_tmp_dirpost_max_size以及max_input_time設置選項。
請注意PHP也支持PUT方法的文件上傳,NetscapeComposer和W3C的Amaya客戶端使用這種方法。請參閱對PUT方法的支持以獲取更多信息。
例39.1.文件上傳表單
可以如下建立一個特殊的表單來支持文件上傳:<!--Thedataencodingtype,enctype,MUSTbespecifiedasbelow-->
<formenctype="multipart/form-data"action="__URL__"method="POST">
<!--MAX_FILE_-->
<inputtype="hidden"name="MAX_FILE_SIZE"value="30000"/>
<!--$_FILESarray-->
Sendthisfile:<inputname="userfile"type="file"/>
<inputtype="submit"value="SendFile"/>
</form>
以上範例中的__URL__應該被換掉,指向一個真實的PHP文件。
MAX_FILE_SIZE隱藏欄位(單位為位元組)必須放在文件輸入欄位之前,其值為接收文件的最大尺寸。這是對瀏覽器的一個建議,PHP也會檢查此項。在瀏覽器端可以簡單繞過此設置,因此不要指望用此特性來阻擋大文件。實際上,PHP設置中的上傳文件最大值是不會失效的。但是最好還是在表單中加上此項目,因為它可以避免用戶在花時間等待上傳大文件之後才發現文件過大上傳失敗的麻煩。
注意:要確保文件上傳表單的屬性是enctype="multipart/form-data",否則文件上傳不了。
全局變數$_FILES自PHP4.1.0起存在(在更早的版本中用$HTTP_POST_FILES替代)。此數組包含有所有上傳的文件信息。
以上範例中$_FILES數組的內容如下所示。我們假設文件上傳欄位的名稱如上例所示,為userfile。名稱可隨意命名。
$_FILES['userfile']['name']
客戶端機器文件的原名稱。
$_FILES['userfile']['type']
文件的MIME類型,如果瀏覽器提供此信息的話。一個例子是「image/gif」。不過此MIME類型在PHP端並不檢查,因此不要想當然認為有這個值。
$_FILES['userfile']['size']
已上傳文件的大小,單位為位元組。
$_FILES['userfile']['tmp_name']
文件被上傳後在服務端儲存的臨時文件名。
$_FILES['userfile']['error']
和該文件上傳相關的錯誤代碼。此項目是在PHP4.2.0版本中增加的。
文件被上傳後,默認地會被儲存到服務端的默認臨時目錄中,除非php.ini中的upload_tmp_dir設置為其它的路徑。服務端的默認臨時目錄可以通過更改PHP運行環境的環境變數TMPDIR來重新設置,但是在PHP腳本內部通過運行putenv()函數來設置是不起作用的。該環境變數也可以用來確認其它的操作也是在上傳的文件上進行的。
例39.2.使文件上傳生效
請查閱函數is_uploaded_file()和move_uploaded_file()以獲取進一步的信息。以下範例處理由表單提供的文件上傳。
<?php
//InPHPversionsearlierthan4.1.0,$HTTP_POST_FILESshouldbeusedinstead
//of$_FILES.
$uploaddir='/var/www/uploads/';
$uploadfile=$uploaddir.basename($_FILES['userfile']['name']);
echo'<pre>';
if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadfile)){
echo"Fileisvalid,andwassuccessfullyuploaded.\n";
}else{
echo"Possiblefileuploadattack!\n";
}
echo'Hereissomemoredebugginginfo:';
print_r($_FILES);
print"</pre>";
?>
接受上傳文件的PHP腳本為了決定接下來要對該文件進行哪些操作,應該實現任何邏輯上必要的檢查。例如可以用$_FILES['userfile']['size']變數來排除過大或過小的文件,也可以通過$_FILES['userfile']['type']變數來排除文件類型和某種標准不相符合的文件,但只把這個當作一系列檢查中的第一步,因為此值完全由客戶端控制而在PHP端並不檢查。自PHP4.2.0起,還可以通過$_FILES['userfile']['error']變數來根據不同的錯誤代碼來計劃下一步如何處理。不管怎樣,要麼將該文件從臨時目錄中刪除,要麼將其移動到其它的地方。
如果表單中沒有選擇上傳的文件,則PHP變數$_FILES['userfile']['size']的值將為0,$_FILES['userfile']['tmp_name']將為空。
如果該文件沒有被移動到其它地方也沒有被改名,則該文件將在表單請求結束時被刪除。
例39.3.上傳一組文件
PHP的HTML數組特性甚至支持文件類型。
<formaction=""method="post"enctype="multipart/form-data">
<p>Pictures:
<inputtype="file"name="pictures[]"/>
<inputtype="file"name="pictures[]"/>
<inputtype="file"name="pictures[]"/>
<inputtype="submit"value="Send"/>
</p>
</form>
<?php
foreach($_FILES["pictures"]["error"]as$key=>$error){
if($error==UPLOAD_ERR_OK){
$tmp_name=$_FILES["pictures"]["tmp_name"][$key];
$name=$_FILES["pictures"]["name"][$key];
move_uploaded_file($tmp_name,"data/$name");
}
}
?>
--------------------------------------------------------------------------------
上一頁上一級下一頁
38.處理XForms起始頁錯誤信息說明
㈦ <INPUT TYPE="file" 中的參數是如何傳遞的
ENCTYPE="multipart/form-data"
<form>標簽里要加這樣一個參數,不加這參數,上傳到伺服器的只是文件路徑,豪無用處。上傳的數據會以一定備塵的表單格式上傳到伺服器,這個格式是固定的
你在servlet中request.getInputStream打開仿毀禪輸入流,然後把裡面的數據全部保存到一個文件里去,看看余如這文件你就知道該怎麼寫了。