2009年8月3日 星期一

PHP:中文檔案上傳及上傳大小限制

今天在弄檔案上傳的程式
途中遇到了一些問題,第一個就是中文檔案無法上傳,另一個則是檔案太大無法上傳

首先看一下上傳檔案程式的原理

HTML部分

<form action="conference_upload.php" method="post" enctype="multipart/form-data">
<div style="text-align:left"><span style="margin-left:12px">姓名:</span><span style="margin-left:28px">
<input type="text" name="username" /></span></div>
<span>上傳檔案:</span><span><input type="file" name="userfile" /></span>
<hr/>
<div style="text-align:right; margin-right:12px"><input type="submit" value="upload" /></div>
</form>


檔案上傳form的兩個重點,method要設成post,enctype要設成multipart/form-data
之後瀏覽檔案的input的name要設定,這樣才能被PHP所用,之後按下submit
檔案會被上傳到server的temp資料夾,等待我們處裡


PHP的部分
<input type="file" name="userfile" />
對照HTML的設定的name可以用$_FILE來獲得檔案資訊
這邊以name設成userfile為例
  1. $_FILES['userfile']['tmp_name'] :得到在temp資料夾的檔案,也就是在user上傳的檔案
  2. $_FILES['userfile']['name']:得到上傳的檔案名稱
  3. $_FILES['userfile']['size']:得到上傳的檔案大小
  4. $_FILES['userfile']['type']:得到上傳的檔案類型
  5. $_FILES['userfile']['error']:得到上傳錯誤時代碼

之後可以使用move_uploaded_file()把上傳的檔案從暫存資料夾移動到指定資料夾
不過在此之前記得先用is_uploaded_file()檢察是否是"上傳"的檔案
因為他有個漏洞,可能會被攻擊

這個漏洞的說明請參考這篇
http://seclists.org/bugtraq/2000/Sep/0237.html


再來就回到我們的問題

首先是中文檔案無法上傳,主要是PHP某些檔案控制的函式沒辦法控制utf-8的中文
所以必須改成big5的格式,如果目錄或檔案要包含中文的話
以我寫的程式為例

$user=$_POST['username'];
$userdir='conference\\'.$user.'_'.date("Y-m-d");
$path=$userdir.'\\'.$_FILES['userfile']['name'];
move_uploaded_file($_FILES['userfile']['tmp_name'],$path);

改成

$user=$_POST['username'];
$userdir=iconv('utf-8','big5','conference\\'.$user.'_'.date("Y-m-d"));
$path=$userdir.'\\'.iconv('utf-8','big5',$_FILES['userfile']['name']);
move_uploaded_file($_FILES['userfile']['tmp_name'],$path);

透過iconv函式編碼後就可以解決了


至於檔案上傳限制問題,必須修改php.ini的兩個地方
要破除檔案大小限制 設定php.ini的 post_max_size 與 upload_max_filesize
這樣就可以上傳自己希望大小的檔案

沒有留言: