在經過form表單進行文件上傳的,PHP須要用到預約義變量$_FILESphp
$_FILES['userfile']['name'] 客戶端機器文件的原名稱。html
$_FILES['userfile']['type'] 文件的 MIME 類型,若是瀏覽器提供此信息的話。一個例子是「image/gif」。不過此 MIME 類型在 PHP 端並不檢查,所以不要想固然認爲有這個值。web
$_FILES['userfile']['size'] 已上傳文件的大小,單位爲字節。數據庫
$_FILES['userfile']['tmp_name'] 文件被上傳後在服務端儲存的臨時文件名。跨域
$_FILES['userfile']['error'] 和該文件上傳相關的錯誤代碼瀏覽器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上傳</title> </head> <body> <form action="upload1.php" method="post" enctype="multipart/form-data"> <div> <input type="file" name="textfile"><p> <input type="submit" value="上傳文件"> </div> </form> </body> </html>
對應處理的PHP代碼安全
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/4/2 * Time: 23:55 */ header('content-type:text/html;charset=utf-8'); print_r($_FILES); //1.經過$_FILES文件上傳變量接收上傳文件信息 $fileInfo=$_FILES['textfile']; $filename=$fileInfo['name']; $type=$fileInfo['type']; $tmp_name=$fileInfo['tmp_name']; $size=$fileInfo['size']; $error=$fileInfo['error']; if($error==UPLOAD_ERR_OK){ if(move_uploaded_file($tmp_name, "upload/".$filename)){ echo '文件'.$filename.'上傳成功'; }else{ echo '文件'.$filename.'上傳失敗'; } }else{ //匹配錯誤信息 switch($error){ case 1: echo '上傳文件超過了PHP配置文件中upload_max_filesize選項的值'; break; case 2: echo '超過了表單MAX_FILE_SIZE限制的大小'; break; case 3: echo '文件部分被上傳'; break; case 4: echo '沒有選擇上傳文件'; break; case 6: echo '沒有找到臨時目錄'; break; case 7: case 8: echo '系統錯誤'; break; } }
上傳一個圖片文件,並打印出數據:服務器
<?php /** * Created by PhpStorm. * User: mac * Date: 16-1-2 * Time: 下午8:30 */ header("Content-type:text/html;charset=utf-8"); // 配置文件須要上傳到服務器的路徑,須要容許全部用戶有可寫權限,不然沒法上傳成功 $uploadPath = 'uploads/'; // 獲取提交的數據 $file = $_FILES['uploadFile']; print_r($file); if($file['error'] > 0) { echo '傳入參數錯誤' . $file['error'] . "<br />"; } else { echo"文件:".$file['name'].'<br/>'; echo"大小:". ($file['size'] / 1024) . 'Kb<br/>'; chmod($uploadPath, 0666); if(file_exists($uploadPath.$file['name'])){ echo $file['name'] . "文件已經存在!"; }else{ move_uploaded_file($file['tmp_name'], $uploadPath.$file['name']); echo '文件以保存在:'.$uploadPath.$file['name']; } }
###打印圖片文件的數據session
```負載均衡
Array ( [textfile] => Array ( [name] => 小英.jpg [type] => image/jpeg [tmp_name] => D:\xampp\tmp\php46DB.tmp [error] => 0 [size] => 20433 ) )
```
Array
(
[name] => 634306d7jw1dvze5y1bk1j.jpg
[type] => image/jpeg
[tmp_name] => /Applications/XAMPP/xamppfiles/temp/phpsJFa8r
[error] => 0
[size] => 36028
)
文件:634306d7jw1dvze5y1bk1j.jpg<br/>
大小:35.18359375Kb<br/><br />
<b>Warning</b>: chmod(): Operation not permitted in <b>/Applications/XAMPP/xamppfiles/htdocs/qzone_partner/upload_file.php</b> on line <b>27</b><br />
文件以保存在:uploads/634306d7jw1dvze5y1bk1j.jpg
##
上面的代碼只能說我把客戶端過來的文件,放在了PHP文件對應的文件夾下面,主要用的的函數就是move_uploaded_file (將上傳的文件移動到新位置)
另外傳輸文件必需要用post方法進行提交,能夠用is_uploaded_file ($_FILES['userfile']['tmp_name'] )進行檢測。
這些也只是簡單的完成文件上傳,通常在實際項目中還要針對不一樣的文件類型,文件大小進行判斷。
對於文件的下載第一種方式就是經過a標籤來完成,直接用href填寫對應的鏈接地址
<a href="1.jpg">下載1.jpg</a>
第二種方式:
經過程序來完成:
php獲得文件的信息來進行下載處理:
<?php $filename=$_GET['filename']; header('content-disposition:attachment;filename='.basename($filename)); header('content-length:'.filesize($filename)); readfile($filename);
對於head函數:
Content-Disposition爲屬性名 attachment爲以附件方式下載
Content-Length首部告訴瀏覽器報文中實體主體的大小
readfile函數輸出一個文件來實現下載的功能
常見的有4種方法
虛擬主機等權限低的,通常在上傳成功或者圖片處理完成之後經過ftp協議等把文件推到其它服務器上
大型網站裏,咱們通常用下面幾種方法
1,上傳地址隨機生成,指向到不一樣的服務器,以達到每一個服務器上傳壓力和存儲負載均衡
2,上傳服務器上有事件監聽事件,有新文件上傳,可使用rsync等協議將文件推到其它服務器
3,經過CDN等方式在有須要的時候,將文件同步到其它服務器
大概有兩個思路
[1]圖片服務器上跑程序,接收上傳的圖片數據{固然要考慮跨域,session共享這些必須的安全限制}
[2]本地服務器接收數據,而後用ftp模塊或者curl傳送到圖片服務器上面
至於老的圖片數據,能夠保持不變,若是要遷移,能夠設置服務器的sync同步數據或者直接ftp上傳多一次,固然。遷移後要批量修改數據庫存放的圖片地址{通常域名會有變化}
相關上傳圖片文章:
PHP+jQuery+Ajax多圖片上傳 http://www.helloweba.com/view-blog-277.html