PHP  

利用 PHP 做檔案上傳欄位

檔案上傳是很常會用到的功能
只是他不像其他表單的用法這麼的直觀
如果要控制上傳的檔名之類的話
就必須要經過一些步驟處理!

下面我們先從頭開始示範:

首先我們先新增兩個PHP檔案以及一個資料夾upload
資料夾是之後上傳檔案想要丟到這裡面的(名稱可以自己取)
另外兩個檔案我直接叫他們
file_upload_a.php
file_upload_b.php
(當然這檔名也可以自取)

[PHP] 上傳檔案

 

首先是file_upload_a.php
主要是讓使用者選檔案用的
所以我們要先新增表單裡的檔案欄位
插入→表單→檔案欄位

[PHP] 上傳檔案

 

我把檔案欄位取名為fileupload
(這邊也是自己取名即可,後面會用到)

[PHP] 上傳檔案

 

表單的動作則設定讓它前往 file_upload_b.php
這樣這頁就做完了

[PHP] 上傳檔案

要特別注意的是表單的編碼類型要改成 multipart/form-data

 

再來我們就要寫file_upload_b.php這個檔案了
為了方便測試檔案有沒有傳成功
我先把一些需要的資訊都先列出
如下

[PHP] 上傳檔案

 

然後我們到程式碼頁面
在後面加入這些php語法

[PHP] 上傳檔案

先說明一下檔案名稱和暫存檔案名稱的作用:
因為網頁在上傳檔案時
是會先把使用者的檔案先暫存起來(這時會是用暫存的檔案名稱存起來)
等檔案傳完後才把完整的檔案搬到真正要放的地方(也就是真正的檔案名稱)

所以我們要加一行語法
讓php可以幫我們做「將暫存的檔案般到真正檔案位置」的工作

語法如下方:
函式名稱是 move_uploaded_file ( 暫存檔名 , 真正檔案的位置和名稱 )
真正檔案的位置因為我們是要放到upload資料夾裡
所以我前面要加一個字串"upload/".

[PHP] 上傳檔案

加完之後存檔就完成了!
測試看看

[PHP] 上傳檔案

他值都有抓到代表有上傳成功

[PHP] 上傳檔案

 

到資料夾看看
果然剛剛傳的圖片已經在裡面囉

[PHP] 上傳檔案

 

但是因為這檔名是直接依照檔案自己的檔名
如果我們想要讓php控制檔案名稱的話呢?

我就再另外開兩個檔案來示範:

file_upload_c.php
file_upload_d.php

[PHP] 上傳檔案

 

原則上file_upload_c.php跟file_upload_a.php差不多
沒有什麼更改
只是多加一個文字欄位
我把它叫做 newfilename (當然也可自行命名)
可以輸入檔案名稱
(這邊我刻意強調不需打副檔名
是因為等等要讓大家看看不加副檔名的結果)

[PHP] 上傳檔案

 

記得表單的動作要改成前往file_upload_d.php

[PHP] 上傳檔案

 

file_upload_d.php的內容也跟之前file_upload_b.php的差不多
只是單純把檔案名稱以及下面那行搬移的語法後面改成 $_POST["newfilename"]

[PHP] 上傳檔案

 

先測試看看
檔案名稱我隨便打

[PHP] 上傳檔案

 

傳成功了
名稱就是我隨便打那一串

[PHP] 上傳檔案

 

但是到資料夾一看
怎麼原本上傳的圖片變成這樣
都沒有副檔名呢?

[PHP] 上傳檔案

 

所以這就要再加一些程式
讓他能夠再幫我們把副檔名長出來
(畢竟一個系統要夠好用、夠方便
就不能讓使用者還得自己輸入副檔名吧!)

只是php他就缺少了幫我們抓原本副檔名的變數
於是只好自己用程式去抓了

副檔名有一個特點
就是前面是被一個點 . 所隔開的
因此我們就可以用php的 explode 函式來把原本檔案名稱以點來分割成陣列!
比方說如果一個檔案叫 belleaya.jpg
他就會分成 "belleaya" 和 "jpg" 兩個陣列元素
而另一個檔案如果叫 belleaya.pixnet.net.jpg
就會分程 "belleaya"、"pixnet"、"net"、"jpg"四個元素

這邊我就用一個新的變數 $fileupload_name 來儲存檔案名稱被切割完的陣列
而副檔名則一定是被切完的最後一個元素
所以只要計算一下陣列中有多少個元素 (也就是使用 count 函式)
再取得最後一個就可以了(要減1是因為元素的index是從0開始計算)

如下
我們只要加兩行取得副檔名
然後原本搬移那行最後面再加上一個點以及副檔名

[PHP] 上傳檔案

 

測試後果然ok囉!!

[PHP] 上傳檔案  

 

 

以上是檔案上傳的基本功能~之後要再跟資料庫結合的話也是基於上述的模式來修改囉!

 

 

 

belleaya (愛) 發表在 痞客邦 PIXNET 留言(8) 人氣()


留言列表 (8)

發表留言
  • fdvd
  • 超厲害!
  • >///////////<

    belleaya (愛) 於 2013/06/08 15:37 回覆

  • mowd8574
  • 要檢查不允許上傳可執行檔,像是.php之類的,不然hacker只要上傳個phpshell,你的server就被攻破了XD
  • 沒錯!!!XDDDDDDDD

    belleaya (愛) 於 2013/06/14 16:45 回覆

  • Xin
  • 請問大大是用什麼去寫PHP程式的,是用Dreamweaver嗎 ?
  • 對呀~~~
    之前是用過Ultra Edit純手工
    不過用到後來還是直接用DW了

    belleaya (愛) 於 2013/11/27 00:03 回覆

  • 自習中
  • 請問
    語法如下方:
    函式名稱是 move_uploaded_file ( 暫存檔名 , 真正檔案的位置和名稱 )
    真正檔案的位置因為我們是要放到upload資料夾裡
    所以我前面要加一個字串"upload/".

    下面的圖片被切掉了 可以請您指導一下嗎
    ((小弟為高職生 正在寫報告的小論文
    您的文章實在讓我獲益良多....謝謝
  • 喔喔~你直接把圖下載下來就可以了!!
    因為他圖片會自動放大所以會很像被切掉QQ

    加油~

    belleaya (愛) 於 2013/12/26 21:29 回覆

  • 訪客

  • Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'C:\WINDOWS\TEMP\php75.tmp' to 'upload/流程.JPG' in C:\AppServ\www\file_upload_b.php on line 15

    看起來暫存檔是有 但是就是無法放進去UPLOAD的資料夾 是哪裡有問題呢
  • 會是資料夾權限的問題嗎?

    belleaya (愛) 於 2015/01/19 01:32 回覆

  • 陶淘
  • 請問
    為什麼我的網頁無法跳轉至file_upload_b.php呢??
  • 他有顯示什麼錯誤訊息嗎?

    belleaya (愛) 於 2015/01/19 01:33 回覆

  • 陶淘
  • 請問為什麼按照上面方式後按了上傳卻抓不到檔案的值