php 多文件上传的处理方法
关于多文件上传我们讲过很多了,下面是一个简单的普通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协议传输格式方面的知识.
本文链接:http://www.phprm.com/scxz/fs4187.html
收藏随意^^请保留教程地址.