關于多文件上傳我們講過很多了,下面是一個簡單的普通form多文件上傳類了,需要的朋友可以下載使用一下,代碼如下:
- <?php
- class upload {
- public $up_ext=array(), $up_max=5210, $up_dir;
- private $up_name, $up_rename=true, $up_num=0, $up_files=array(), $up_ret=array();
- function __construct($name, $ext=array(), $rename=true) {
- if (!emptyempty($name)) {
- $this->up_name = $name;
- !emptyempty($ext) && $this->up_ext = $ext;
- $this->up_rename = $rename;
- $this->up_dir = website_dirroot.
- $globals['cfg_upload_path'];
- $this->initupload();
- } else {
- exit('upload文件域名稱為空,初始化失??!');
- }
- }
- private function initupload() {
- if (is_array($_files[$this->up_name])) {
- $up_arr = count($_files[$this->up_name]);
- $up_all = count($_files[$this->up_name], 1);
- $up_cnt = ($up_all - $up_arr) / $up_arr;
- for ($i = 0; $i < $up_cnt; $i ++) {
- if ($_files[$this->up_name]['error'][$i] != 4) {
- $this->up_files[] = array(
- 'tmp_name' => $_files[$this->up_name]['tmp_name'][$i],
- 'name' => $_files[$this->up_name]['name'][$i],
- 'type' => $_files[$this->up_name]['type'][$i],
- 'size' => $_files[$this->up_name]['size'][$i],
- 'error' => $_files[$this->up_name]['error'][$i]
- );
- }
- }
- $this->up_num = count($this->up_files);
- } else {
- if (isset($_files[$this->up_name])) {
- $this->up_files = array(
- 'tmp_name' => $_files[$this->up_name]['tmp_name'],
- 'name' => $_files[$this->up_name]['name'],
- 'type' => $_files[$this->up_name]['type'],
- 'size' => $_files[$this->up_name]['size'],
- 'error' => $_files[$this->up_name]['error']
- );
- $this->up_num = 1;
- } else {
- exit('沒找找到需要upload的文件!');
- }
- }
- $this->chkupload();
- }
- private function chkupload() {
- if (emptyempty($this->up_ext)) {
- $up_mime = array('image/wbmp', 'image/bmp', 'image/gif', 'image/pjpeg', 'image/x-png');
- foreach ($this->up_files as $up_file) {
- $up_allw = false;
- foreach ($up_mime as $mime) {
- if ($up_file['type'] == $mime) {
- $up_allw = true; break;
- }
- }
- !$up_allw && exit('不允許上傳'.$up_file['type'].'格式的文件!');
- if ($up_file['size'] / 1024 > $this->up_max) {
- exit('不允許上傳大于 '.$this->up_max.'k 的文件!');
- }
- }
- } else {
- foreach ($this->up_files as $up_file) {
- $up_ext = end(explode('.', $up_file['name']));
- $up_allw = false;
- foreach ($this->up_ext as $ext) {
- if ($up_ext == $ext) {
- $up_allw = true; break;
- }
- }
- !$up_allw && exit('不允許上傳.'.$up_ext.'格式的文件!');
- if ($up_file['size'] / 1024 > $this->up_max) {
- exit('不允許上傳大于 '.$this->up_max.'k 的文件!');
- }
- }
- }
- $this->uploading();
- }
- private function uploading() {
- if (io::dircreate($this->up_dir)) {
- if (chmod($this->up_dir, 0777)) {
- if (!emptyempty($this->up_files)) {
- foreach ($this->up_files as $up_file) {
- if (is_uploaded_file($up_file['tmp_name'])) {
- $file_name = $up_file['name'];
- if ($this->up_rename) {
- $file_ext = end(explode('.', $file_name));
- $file_rnd = substr(md5(uniqid()), mt_rand(0, 26), 6);
- $file_name = date('ymdhis').'_'.$file_rnd.'.'.$file_ext;
- }
- $file_name = $this->up_dir.'/'.$file_name;
- if (move_uploaded_file($up_file['tmp_name'], $file_name)) {
- $this->up_ret[] = str_replace(website_dirroot, '', $file_name);
- } else {
- exit('文件上傳失敗!');
- }
- }
- }
- }
- } else {
- exit('未開啟寫入權限!');
- }
- } else {
- exit('上傳目錄創建失??!');
- }
- }
- public function getupload() {
- return emptyempty($this->up_ret) ? false : $this->up_ret;
- }
- function __destruct() {}
- }
- ?>
大量文件或大體積文件的情況可以考慮調用組件解決(如前文提到的swfupload組件),然而有些情況只需要傳遞幾個文件,而且文件體積并不太大,這種情況下使用組件則有點牛刀殺雞的感覺,通過html自帶的<input type="file">表單就可以實現需要的功能,關鍵在于后臺接收程序的處理.
php處理上傳做的很方便,上傳文件的信息通過服務器自動處理到$_files數組中,開發者只需要使用的內置處理函數簡單操作就可以啦。asp教程開發者則沒有這么幸運,官方并沒有提供直接的處理方法,需要開發者自己設計,這時就需要開發者了解iis對enctype="multipart/form-data"表單的處理方式,iis把enctype="multipart/form-data"表單提交的數據存儲成二進制數據,以二進制格式返回給開發者,開發者則需要通過lenb、midb的字節處理函數來分析獲取的上傳內容,客戶端發送的具體表單數據格式,可以了解下http rfc1867協議傳輸格式方面的知識.
|
新聞熱點
疑難解答