近年來,隨著互聯網的普及,上傳圖片已成為許多網站必備的功能。為了提升用戶體驗,javascript和php是目前最常用的方式。下面我們就來詳細介紹一下如何使用javascript和php實現上傳圖片。
要實現上傳圖片功能,首先需要一個input標簽(type為file)。其中的name屬性需注意,它將決定后臺收到的文件名。例如,我們可以定義如下的html標簽:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="img"> <input type="submit"> </form>這樣,當用戶點擊submit按鈕時,上傳的圖片就可以被傳送到后臺了。 接著,我們需要在php后臺編寫代碼來處理上傳的圖片。其中最常用的函數是move_uploaded_file(),它將上傳的圖片轉移到指定目錄下。下面是一個簡單的php上傳代碼:
if(!empty($_FILES["img"])){ $name=$_FILES["img"]["name"]; $tmp_name=$_FILES["img"]["tmp_name"]; move_uploaded_file($tmp_name,"./upload/".$name); }這段代碼首先通過$_FILES["img"]來獲取上傳的文件信息,包括文件類型、大小、臨時文件名等。然后它利用move_uploaded_file()函數將圖片從臨時目錄轉移到指定目錄下。在上面的例子里,圖片被轉移到名為"upload"的文件夾下。 但是這個簡單的上傳方式存在一個問題:任何人都可以上傳可執行的php文件。如果上傳成功,這個php腳本就可以執行,導致嚴重的安全問題。因此,我們有必要手動進行文件類型和大小的限制,以保障系統的安全。 首先,我們可以運用php內置函數finfo_file()來判斷文件類型是否合法。下面是使用finfo_file()的php代碼:
$finfo=finfo_open(FILEINFO_MIME_TYPE); $filetype=finfo_file($finfo,$_FILES["img"]["tmp_name"]); $filetype=explode("/",$filetype); if($filetype[0]!="image"){ echo "圖片格式錯誤!"; } finfo_close($finfo);上面的代碼利用finfo_file()函數獲取上傳文件的MIME類型,并將它以“/”作為分割符,分成兩部分。如果第一部分不是"image",就說明上傳的不是圖片格式。在這里,我們利用echo語句來告訴用戶錯誤信息。 接下來,我們還需要根據需要限制文件大小。這可以通過$_FILES["img"]["size"]來實現。下面是一個簡單的php代碼:
if($_FILES["img"]["size"]>1024*1024){ echo "文件過大!"; exit(); }上面的代碼限制上傳圖片最大為1MB。如果超過這個大小,就將結果輸出給用戶,并停止執行程序(通過exit()函數)。 最終,為了保障安全與穩定性,我們還需要對上傳的文件進行重命名。這可以通過運用php內置函數rename()來實現。下面的php代碼就是一個例子:
if(!empty($_FILES["img"])){ $name=date("YmdHis").rand(1000,9999).".jpg"; $tmp_name=$_FILES["img"]["tmp_name"]; $path="./upload/".$name; $filetype=$_FILES["img"]["type"]; $finfo=finfo_open(FILEINFO_MIME_TYPE); $real_type=finfo_file($finfo,$tmp_name); finfo_close($finfo); if($real_type!=$filetype){ echo "文件類型錯誤!"; exit(); } if($_FILES["img"]["size"]>1024*1024){ echo "文件過大!"; exit(); } move_uploaded_file($tmp_name,$path); echo "上傳成功!"; }上面的代碼首先生成一個隨機的文件名,然后利用rename()函數將其轉移。在轉移過程中,我們還利用finfo_file()函數判斷文件類型是否合法,利用$_FILES["img"]["size"]判斷文件大小是否合規,以確保上傳能夠安全進行。 把上面的php代碼與前面的html代碼組合,就能夠實現基本的上傳圖片功能。當然,如果想要拓展更多功能(例如上傳進度顯示),還需要更深入的php和javascript知識。