當前位置:ag真人国际官网-ag旗舰厅官方网站 » 文件管理 » form多文件上傳
form多文件上傳-ag真人国际官网
發布時間: 2024-11-15 05:09:21
上傳表單
在thinkphp中使用上傳功能無需進行特別處理。例如,下面是一個帶有附件上傳的表單提交:
注意,要使用上傳功能 你的表單需要設置 enctype="multipart/form-data"
多文件上傳支持
如果需要使用多個文件上傳,只需要修改表單,把
改為
或者
兩種方式的多附件上傳系統的文件上傳類都可以自動識別。
上傳操作
thinkphp文件上傳操作使用think\upload類,假設前面的表單提交到當前控制器的upload方法,我們來看下upload方法的實現代碼:
public function upload(){
$upload = new \think\upload();// 實例化上傳類
$upload->maxsize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootpath = './uploads/'; // 設置附件上傳根目錄
$upload->savepath = ''; // 設置附件上傳(子)目錄
// 上傳文件
$info = $upload->upload();
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->geterror());
}else{// 上傳成功
$this->success('上傳成功!');
}
}
上傳類對圖片文件的上傳安全做了支持,如果企圖上傳非法的圖像文件,系統會提示 非法圖像文件。 為了更好的使用上傳功能,建議你的伺服器開啟finfo模塊支持
上傳參數
在上傳操作之前,我們可以對上傳的屬性進行一些設置,upload類支持的屬性設置包括:
屬性描述
maxsize文件上傳的最大文件大小(以位元組為單位),0為不限大小
rootpath文件上傳保存的根路徑
savepath文件上傳的保存路徑(相對於根路徑)
savename上傳文件的保存規則,支持數組和字元串方式定義
saveext上傳文件的保存後綴,不設置的話使用原文件後綴
replace存在同名文件是否是覆蓋,默認為false
exts允許上傳的文件後綴(留空為不限制),使用數組或者逗號分隔的字元串設置,默認為空
mimes允許上傳的文件類型(留空為不限制),使用數組或者逗號分隔的字元串設置,默認為空
autosub自動使用子目錄保存上傳文件 默認為true
subname子目錄創建方式,採用數組或者字元串方式定義
hash是否生成文件的hash編碼 默認為true
callback檢測文件是否存在回調,如果存在返迴文件信息數組
上面的屬性可以通過兩種方式傳入:
實例化傳入
我們可以在實例化的時候直接傳入參數數組,例如:
$config = array(
'maxsize' => 3145728,
'rootpath' => './uploads/',
'savepath' => '',
'savename' => array('uniqid',''),
'exts' => array('jpg', 'gif', 'png', 'jpeg'),
'autosub' => true,
'subname' => array('date','ymd'),
);
$upload = new \think\upload($config);// 實例化上傳類
關於savename和subname的使用後面我們會有詳細的描述。
動態賦值
支持在實例化後動態賦值上傳參數,例如:
$upload = new \think\upload();// 實例化上傳類
$upload->maxsize = 3145728;
$upload->rootpath = './uploads/';
$upload->savepath = '';
$upload->savename = array('uniqid','');
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');
$upload->autosub = true;
$upload->subname = array('date','ymd');
上面的設置和實例化傳入的效果是一致的。
上傳文件信息
設置好上傳的參數後,就可以調用think\upload類的upload方法進行附件上傳,如果失敗,返回false,並且用geterror方法獲取錯誤提示信息;如果上傳成功,就返回成功上傳的文件信息數組。
$upload = new \think\upload();// 實例化上傳類
$upload->maxsize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootpath = './uploads/'; // 設置附件上傳根目錄
$upload->savepath = ''; // 設置附件上傳(子)目錄
// 上傳文件
$info = $upload->upload();
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->geterror());
}else{// 上傳成功 獲取上傳文件信息
foreach($info as $file){
echo $file['savepath'].$file['savename'];
}
}
每個文件信息又是一個記錄了下面信息的數組,包括:
屬性描述
key附件上傳的表單名稱
savepath上傳文件的保存路徑
name上傳文件的原始名稱
savename上傳文件的保存名稱
size上傳文件的大小
type上傳文件的mime類型
ext上傳文件的後綴類型
md5上傳文件的md5哈希驗證字元串 僅當hash設置開啟後有效
sha1上傳文件的sha1哈希驗證字元串 僅當hash設置開啟後有效
文件上傳成功後,就可以使用這些文件信息來進行其他的數據操作,例如保存到當前數據表或者單獨的附件數據表。
例如,下面表示把上傳信息保存到數據表的欄位:
$model = m('photo');
// 取得成功上傳的文件信息
$info = $upload->upload();
// 保存當前數據對象
$data['photo'] = $info[0]['savename'];
$data['create_time'] = now_time;
$model->add($data);
單文件上傳
upload方法支持多文件上傳,有時候,我們只需要上傳一個文件,就可以使用upload類提供的uploadone方法上傳單個文件,例如:
public function upload(){
$upload = new \think\upload();// 實例化上傳類
$upload->maxsize = 3145728 ;// 設置附件上傳大小
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');// 設置附件上傳類型
$upload->rootpath = './uploads/'; // 設置附件上傳根目錄
// 上傳單個文件
$info = $upload->uploadone($_files['photo1']);
if(!$info) {// 上傳錯誤提示錯誤信息
$this->error($upload->geterror());
}else{// 上傳成功 獲取上傳文件信息
echo $info['savepath'].$info['savename'];
}
}
uploadone方法上傳成功後返回的文件信息和upload方法的區別是只有單個文件信息的一維數組。
上傳文件的命名規則
上傳文件的命名規則(savename)用於確保文件不會產生沖突或者覆蓋的情況。命名規則的定義可以根據你的業務邏輯來調整,不是固定的。例如,如果你採用時間戳的方式來定義命名規范,那麼在同時上傳多個文件的時候可能產生沖突(因為同一秒內可以上傳多個文件),因此你需要根據你的業務需求來設置合適的上傳命名規則。這里順便來說下savename參數的具體用法。
一、採用函數方式
如果傳入的字元串是一個函數名,那麼表示採用函數動態生成上傳文件名(不包括文件後綴),例如:
// 採用時間戳命名
$upload->savename = 'time';
// 採用guid序列命名
$upload->savename = 'com_create_guid';
也可以採用用戶自定義函數
// 採用自定義函數命名
$upload->savename = 'myfun';
默認的命名規則設置是採用uniqid函數生成一個唯一的字元串序列。
savename的值支持數組和字元串兩種方式,如果是只有一個參數或者沒有參數的函數,直接使用字元串設置即可,如果需要傳入額外的參數,可以使用數組方式,例如:
// 採用date函數生成命名規則 傳入y-m-d參數
$upload->savename = array('date','y-m-d');
// 如果有多個參數需要傳入的話 可以使用數組
$upload->savename = array('myfun',array('__file__','val1','val2'));
如果需要使用上傳的原始文件名,可以採用__file__傳入,所以上面的定義規則,最終的結果是 myfun('上傳文件名','val1','val2')執行的結果。
二、直接設置上傳文件名
如果傳入的參數不是一個函數名,那麼就會直接當做是上傳文件名,例如:
$upload->savename = time().'_'.mt_rand();
表示上傳的文件命名採用時間戳加一個隨機數的組合字元串方式。
當然,如果覺得有必要,你還可以固定設置一個上傳文件的命名規則,用於固定保存某個上傳文件。
$upload->savename = 'thinkphp';
三、保持上傳文件名不變
如果你想保持上傳的文件名不變,那麼只需要設置命名規范為空即可,例如:
$upload->savename = '';
一般來說不建議保持不變,因為會導致相同的文件名上傳後被覆蓋的情況。
子目錄保存
savename只是用於設置文件的保存規則,不涉及到目錄,如果希望對上傳的文件分子目錄保存,可以設置autosub和subname參數來完成,例如:
// 開啟子目錄保存 並以日期(格式為ymd)為子目錄
$upload->autosub = true;
$upload->subname = array('date','ymd');
可以使用自定義函數來保存,例如:
// 開啟子目錄保存 並調用自定義函數get_user_id生成子目錄
$upload->autosub = true;
$upload->subname = 'get_user_id';
和savename參數一樣,subname的定義可以採用數組和字元串的方式。
注意:如果get_user_id函數未定義的話,會直接以get_user_id字元串作為子目錄的名稱保存。
子目錄保存和文件命名規則可以結合使用。
上傳驅動
上傳類可以支持不同的環境,通過相應的上傳驅動來解決,默認情況下使用本地(local)上傳驅動,當然,你還可以設置當前默認的上傳驅動類型,例如:
'file_upload_type' => 'ftp',
'upload_type_config' => array(
'host' => '192.168.1.200', //伺服器
'port' => 21, //埠
'timeout' => 90, //超時時間
'username' => 'ftp_user', //用戶名
'password' => 'ftp_pwd', //密碼 ),
表示當前使用ftp作為上傳類的驅動,上傳的文件會通過ftp傳到指定的遠程伺服器。
也可以在實例化上傳類的時候指定,例如:
$config = array(
'maxsize' = 3145728,
'rootpath' = './uploads/',
'savepath' = '',
'savename' = array('uniqid',''),
'exts' = array('jpg', 'gif', 'png', 'jpeg'),
'autosub' = true,
'subname' = array('date','ymd'),
);
$ftpconfig = array(
'host' => '192.168.1.200', //伺服器
'port' => 21, //埠
'timeout' => 90, //超時時間
'username' => 'ftp_user', //用戶名
'password' => 'ftp_pwd', //密碼 );
$upload = new \think\upload($config,'ftp',$ftpconfig);// 實例化上傳類
目前已經支持的上傳驅動包括local、ftp、sae、bcs、七牛和又拍雲等。
『貳』 jquery多圖片上傳(form表單序列化提交)為啥後台只獲取一個圖片文件
直接用$_post['data'];獲取即可的;
$data = $_post['data'];
echo '
';
print_r($data);
die();這樣就是一個數組,你無需再用什麼序列化、反序列化之類的,你可以輸出$_post的數據看看就知道勒!(*^__^*)
若有任何其它疑問,歡迎追問......
評論
0
0
載入更多
『叄』 怎麼在form里分別上傳多個文件,如圖
可以用iframe上傳,orm表單的method、 enctype屬性必須和下面代碼一樣。然後將target的值設為iframe的name,這樣就可以實現無刷新上傳文件。
『肆』 如果有個100m大的文件,需要上傳至伺服器中,而伺服器form表單最大隻能上傳2m,可以用什麼方法
【答案】:首先來說使用http協議上傳數據,特別在android下,跟form沒什麼關系。傳統的在web中,在form中寫文件上傳,其實瀏覽器所做的就是將我們的數據進行解析組拼成字元串,以流的方式發送到伺服器,且上傳文件用的都是post方式,post方式對大小沒什麼限制。回到題目,可以說假設每次真的只能上傳2m,那麼可能我們只能把文件截斷,然後分別上傳了。
熱點內容