日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php文件教程,php的文件上传入门教程(实例讲解)

發布時間:2024/1/23 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php文件教程,php的文件上传入门教程(实例讲解) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、文件上傳

為了讓客戶端的用戶能夠上傳文件,我們必須在用戶界面中提供一個表單用于提交上傳文件的請求。由于上傳的文件是一種特殊數據,不同于其它的post數據,所以我們必須給表單設置一個特殊的編碼:

以上的enctype屬性,你可能不太熟悉,因為這常常會被忽略掉。但是,如果http post請求中既有常規數據,又包含文件類數據的話,這個屬性就應該顯示加上,這樣可以提高針對各種瀏覽器的兼容性。

接下來,我們得向表單中添加一個用于上傳文件的字段:

上述文件字段在各種瀏覽器中可能表現會有所不同。對于大多數的瀏覽器,上述字段都會被渲染成一個文本框加上一個瀏覽按鈕。這樣,用戶既可以自行輸入文件的路徑到文本框中,也可以通過瀏覽按鈕從本地硬盤上選擇所要上傳的文件。但是,在蘋果的Safari中,貌似只能使用瀏覽這種方式。當然,你也可以自定義這個上傳框的樣式,使它看起來比默認的樣式優雅些。

下面,為了更好的闡述怎么樣處理文件上傳,舉一個完整的例子。比如,以下一個表單允許用戶向我的本地服務器上上傳附件:

請上傳你的附件:

提示:可以通過php.ini中的upload_max_filesize來設置允許上傳文件的最大值。另外,還有一個post_max_size也可以用來設置允許上傳的最大表單數據,具體意思就是表單中各種數據之和,所以你也可以通過設置這個字段來控制上傳文件的最大值。但是,注意后者的值必須大于前者,因為前者屬于后者的一部分表單數據。

圖1. 顯示在在firefox中的上傳表單

當這個表單提交的時候,http請求會被發送到upload.php。為了顯示具體哪些信息可以在upload.php中使用,我在upload.php將其打印出來:

header('Content-Type: text/plain');

print_r($_FILES);

下面來做個試驗,假如我通過以上表單上傳一個本博客的logo到我的本地服務器www.360weboy.me/upload.php,看看在upload.php中會輸出什么信息:

Array

(

[attachment] => Array

(

[name] => boy.jpg

[type] => image/jpeg

[tmp_name] => D:\xampp\tmp\php1168.tmp

[error] => 0

[size] => 11490

)

)

以上就是文件上傳后,在全局數組中的關于當前上傳文件的所有信息。但是,我們是否能夠保證這些信息是安全的,假如name或者其它信息被篡改過了呢?我們時刻需要對來自客戶端的信息保持警惕!

具體的http請求的各個部分

為了更好的理解文件上傳,我們必須核對下客戶端發送的http請求中到底包含了那些具體的信息。先前我上傳的附件是本博客的logo,因為是圖片,不太適合我們做以上實驗。所以,我重新上傳一個test.text文本文件,其中具體包含了以下內容:

360w

360days

Life Of A Web Boy

Okay。現在我上傳這個文本文件,在upload.php中會輸出:

Array

(

[attachment] => Array

(

[name] => test.txt

[type] => text/plain

[tmp_name] => D:\xampp\tmp\php51C0.tmp

[error] => 0

[size] => 40

)

)

我們再來看下相關的瀏覽器發送的http post請求(一些可選的頭部我省略了):

POST /upload.php HTTP/1.1

Host: www.360weboy.me

Referer: http://www.360weboy.me/

multipart/form-data; boundary=---------------------------24464570528145

Content-Length: 234

-----------------------------24464570528145

Content-Disposition: form-data; name="attachment"; filename="test.txt"

Content-Type: text/plain

360weboy

360days

Life Of A Web Boy

-----------------------------24464570528145--

從上面的請求格式中有幾個字段我們要關注下的,分別是name, filename以及Content-Type.它們分別表示上傳文件框在form表單中的字段名-attachment,用戶從本地硬盤中上傳的文件名 – test.txt,以及上傳的文件格式 – text/plain(代表文本文件)。然后,我們看到一行空行下面的,就是這個上傳文件中的具體內容。

二、安全性的加強

為了加強文件上傳中的安全性,我們需要檢查下$_FILES全局數組中的tmp_name和size。為了確保tmp_name指向的文件確實是剛剛用戶在客戶端上傳的文件,而不是指向的類似/etc/passwd,可以使用php中的函數is_uploaded_file()來進行下判斷:

$filename = $_FILES['attachment']['tmp_name'];

if (is_uploaded_file($filename)) {

/* 是一個上傳的文件. */

}

某些情況下,用戶上傳文件后,可能會將上傳成功的文件的內容顯示給用戶看下,那么上述代碼的檢查尤其重要。

另外一個需要檢查的就是上傳文件的mime-type, 也就是上述upload.php中輸出數組的type字段。 我在第一個例子中上傳的是一個圖片,所以$_FILES['attachment']['type']的值為'image/jpeg'。 如果打算在服務器端只接受image/png, image/jpeg, image/gif, image/x-png 以及 image/p-jpeg這些mime-type的圖片,可以用類似下面的代碼了進行檢查(只是舉個例子,具體代碼,比如報錯等,應該遵循你的系統中的機制):

$allow_mimes = array(

'image/png',

'image/x-png',

'image/gif',

'image/jpeg',

'image/pjpeg'

);

$image = $_FILES['attachment'];

if(!in_array($image['type'], $allow_mimes)) {

die('對不起, 你上傳的文件格式不準確;我們只接受圖片文件.');

}

// 繼續處理上傳的圖片文件

正如你看到的,我們已經保準了文件的mime-type是符合服務器端的要求的。但是,這樣是不是就可以防止惡意用戶上傳其它有害文件,還是不夠的,因為這個mime-type惡意用戶是可以偽裝的。 比如用戶做了一張jpg圖片,在圖片的元數據中寫入了一些惡意的php代碼,然后保存為后綴名為php的文件。當這個惡意文件上傳的時候,將順利通過服務器端對于mime-type的檢查,被認為是一張圖片,里面的危險的php代碼將會被執行。具體的圖片的元數據類似如下:

File name??? : image.jpg

File size??? : 182007 bytes

File date??? : 2012:11:27 7:45:10

Resolution?? : 1197 x 478

Comment????? : passthru($_POST['cmd']); __halt_compiler();

我們可以看到,在圖片元數據的Comment字段中加入了php代碼。所以,很顯然,為了防止類似危險情況發生,還必須對上傳文件的擴展名進行一次必要的檢查。下面的代碼對前面的檢查Mime-type的代碼進行了加強:

$allow_mimes = array(

'image/png' => '.png',

'image/x-png' => '.png',

'image/gif' => '.gif',

'image/jpeg' => '.jpg',

'image/pjpeg' => '.jpg'

);

$image = $_FILES['attachment'];

if(!array_key_exists($image['type'], $allow_mimes )) {

die('對不起, 你上傳的文件格式不準確;我們只接受圖片文件.');

}

// 獲取略去后綴名的文件名:

$filename = substr($image['name'], 0, strrpos($image['name'], '.'));

// 添加后綴名

$filename .= $allow_mimes[$image['type']];

// 繼續處理上傳的文件

通過上述的代碼,我們確保即使上傳的圖片的元文件中包含了php代碼的話,圖片文件會被重名為后綴名為圖片格式的文件,所以其中的php代碼也不會被執行了。上述代碼對正常的上傳的圖片也不會有任何負面影響。

進行了上述的幾步提高安全性的檢查步驟后,如果你只是要把上傳的文件保存到一個指定的目錄中,那么就可以使用php的默認函數move_uploaded_file來實現了:

$tmp_filename = $_FILES['attachment']['tmp_name'];

$filename = '/path/to/attachment.txt';

if (move_uploaded_file(tmp_filename, $filename)) {

/* $temp_filename 保存在臨時目錄中的上傳文件, 然后成功將其保存到對應目錄下的attachment.txt文件中. */

}

你也許還要對上傳文件的大小進行限制,那么你可以通過filesize函數來獲取上傳文件的大小,進行判斷后做進一步處理,這具體就不在這將了,自己去折騰吧。

好了,關于文件上傳暫時就寫到這里吧。希望這篇入門篇文章對你有所幫助。

總結

以上是生活随笔為你收集整理的php文件教程,php的文件上传入门教程(实例讲解)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。