之前写文件上传类上传多个文件的话最后只能得到一个文件名,因为原来是用字符串成员变量存储的文件名,所以只能存一个,这侧把存储文件名的变量改为了数组,最后上传完后用户得到的是一个数组,包含了所上传的所有文件<?php <br />
/**<br>
* FileUpload.class.php<br>
* @Description 多文件上传类<br>
* @author: yulipu<br>
* Time: 2013-10-3<br>
* include "FileUpload.class.php";<br>
* $up=new FileUpload(array('savepath'=>'./mytest/'));<br>
* $up->uploadFile('userfile'); //userfile 为input框的name值 多文件时input 的name值要有中括号: name="userfile[]" 没有中括号只能上传第一个文件<br>
* echo $up->getErrorMsg(); //得到错误信息<br>
* <br>
* 基本功能有 都以参数形式传入构造函数<br>
* 指定上传文件格式 [array] allowtype <br>
* 指定文件大小 [int] maxsize<br>
* <br>
* 实例1 上传头像到指定目录 并以随即名保存 文件名长度为20(默认为20)<br>
* $up = new FileUpload(array('savepath'=>'./avatar/', 'israndname'=>true, 'newfilenamelength'=>20));<br>
* 实例2 上传头像到指定目录 并且用用户id作为文件名 如上传 photo.png 保存为 2.png<br>
* $up = new FileUpload(array('savepath'=>'./avatar/', 'israndname'=>false, 'givenfilename'=>2));<br>
* 实例3 上传头像到指定目录 在目录下以日期为单位建立子目录保存头像<br>
* $up = new FileUpload(array('savepath'=>'./avatar/', 'subdirpattern'=>'Y/m' , 'israndname'=>false, 'givenfilename'=>2));<br>
* 以上生成目录为 './avatar/2013/10'<br>
*/<br>
class FileUpload {<br>
private $name = 'name';<br>
private $type = 'type';<br>
private $tmp_name = 'tmp_name';<br>
private $error = 'error';<br>
private $size = 'size';<br>
<br>
// 构造方法用到的字段<br>
private $savepath = ''; //指定上传文件保存的路径<br>
private $subdirpattern = ''; // 结合savepath使用 为空表示不添加子目录,不为空 比如 'Y/m' 表示 2011/01 那么保存路径就是 $savepath . '/2011/01'<br>
private $allowtype = array('gif', 'jpg', 'png');<br>
private $maxsize = 204800; //Byte 200K<br>
private $israndname = true; //是否随机重命名 true false不随机 使用原文件名<br>
private $givenfilename = ''; //使用给定的文件名 配合 israndname 使用<br>
private $ignoreemptyfile = true; //是否忽略没有上传文件的文本域<br>
private $newfilenamelength = 20;<br>
<br>
// 本类用到的字段<br>
private $errorMessage = '';<br>
private $uploadFileArray = null;<br>
private $originalFileName = '';<br>
private $expandedName = '';<br>
public $newFileName = array();<br>
<br>
<br>
//1. 指定上传路径, 2,充许的类型, 3,限制大小, 4,是否使用随机文件名称<br>
//new FileUpload( array('savepath'=>'./uploads/', 'allowtype'=>array('txt','gif'), 'israndname'=>true) );<br>
public function __construct($args=array()) {<br>
foreach($args as $key => $value) {<br>
$key = strtolower($key);<br>
//查看用户参数中数组的下标是否和成员属性名相同<br>
//if(!in_array( $key, get_class_vars(get_class($this)) )) {<br>
// continue;<br>
//}<br>
$this->setArgs($key, $value);<br>
}<br>
}<br>
<br>
private function setArgs($key, $value) {<br>
$this->$key = $value;<br>
}<br>
<br>
/**<br>
* 得到文件大小<br>
* @param int size 字节数<br>
*/<br>
private function getFileSize($size) {<br>
$unit = 'Bytes';<br>
if($size
return $size.$unit;<br>
} else if($size
$unit = 'KB';<br>
$size = round($size / 1024, 2);<br>
} else if($size
$unit = 'MB';<br>
$size = round($size / pow(1024, 2), 2);<br>
} else if($size
$unit = 'GB';<br>
$size = round($size / pow(1024, 3), 2);<br>
} else {<br>
$unit = 'TB';<br>
$size = round($size / pow(1024, 4), 2);<br>
}<br>
<br>
return $size.$unit;<br>
}<br>
<br>
/**<br>
* 得到一个数组的键组成的数组<br>
*/<br>
private function myArray_keys(& $arr) {<br>
$returnArr = array();<br>
foreach($arr as $key => $val) {<br>
$returnArr[] = $key;<br>
}<br>
<br>
return $returnArr;<br>
}<br>
/* 没排序时<br>
Array<br>
(<br>
[f1] => Array<br>
(<br>
[name] => Array<br>
(<br>
[0] => Winter.jpg<br>
)<br>
// 凡是加了[] 这里的name格式就成了数组 这是才能支持多文件<br>
// 凡是不加[] 这里的name格式就是字符串 也就是只能上传第一个文件<br>
<br>
[type] => Array<br>
(<br>
[0] => image/jpeg<br>
)<br>
<br>
[tmp_name] => Array<br>
(<br>
[0] => C:\WINDOWS\TEMP\php38D.tmp<br>
)<br>
<br>
[error] => Array<br>
(<br>
[0] => 0<br>
)<br>
<br>
[size] => Array<br>
(<br>
[0] => 105542<br>
)<br>
<br>
)<br>
<br>
)<br>
*/<br>
<br>
/**<br>
* 重新排列上传文件<br>
* $uploadFileArray 上传的文件的数组<br>
*/<br>
private function reSortFile(& $uploadFileArray) {<br>
// input name没有[] 时是字符串<br>
// 有[] 时是数组<br>
$multiFlag = is_array($uploadFileArray[$this->name]) ? true : false;<br>
$file_arr = array();<br>
<br>
$file_num = $multiFlag ? count($uploadFileArray[$this->name]) : 1; //计算上传的文件数<br>
$file_keys = $this->myArray_keys($uploadFileArray); //得到数组,包含了name type error tmp_name size<br>
<br>
for($i=0; $i
foreach($file_keys as $value) {<br>
$file_arr[$i][$value] = $multiFlag ? $uploadFileArray[$value][$i] : $uploadFileArray[$value];<br>
}<br>
}<br>
<br>
return $file_arr;<br>
}<br>
<br>
/**<br>
* 错误报告 <br>
* $errorno 错误号<br>
*/<br>
private function setErrorMsg($errorno){<br>
$msg = "上传文件<font> {$this->originalFileName} </font>时出错: ";<br>
switch($errorno){<br>
case 1:<br>
case 2:<br>
$msg .= '文件过大,无法上传'; //配置文件中的大小<br>
case 3:<br>
$msg .= '文件只被部分上传'; break;<br>
case -1:<br>
$msg .= '不充许的文件类型'; break;<br>
case -2:<br>
$msg .= '文件过大,上传文件不能超过'.$this->getFileSize($this->maxsize); break;<br>
case -3: <br>
$msg .= '上传失败'; break;<br>
case -4:<br>
$msg .= '建立存放上传文件目录失败,请重新指定上传目录'; break;<br>
case -5:<br>
$msg .= '必须指定上传文件的路径'; break;<br>
case -6:<br>
$msg .= '不是上传的文件'; break;<br>
default: $msg .= "未知错误";<br>
}<br>
return $msg.'<br>';<br>
}<br>
<br>
/**<br>
* 检查有没有指定上传路径<br>
*/<br>
private function emptySavePath() {<br>
if(empty($this->savepath)) {<br>
$this->errorMessage .= $this->setErrorMsg(-5);<br>
return true;<br>
}<br>
return false;<br>
}<br>
<br>
/**<br>
* 得到扩展名<br>
* $fileName 文件名<br>
*/<br>
private function getExpandedName() {<br>
$pos = strrpos($this->originalFileName, '.');<br>
return substr($this->originalFileName, $pos+1);<br>
}<br>
<br>
/**<br>
* 检查文件扩展名是够合法<br>
*/<br>
private function isLegalExpandedName() {<br>
if(in_array($this->expandedName, $this->allowtype)) {<br>
return true;<br>
}<br>
$this->errorMessage .= $this->setErrorMsg(-1);<br>
<br>
return false;<br>
}<br>
<br>
/**<br>
* 检查上传的文件有没有错误<br>
* $i 第几个文件<br>
*/<br>
private function hasError($i) {<br>
$errorno = $this->uploadFileArray[$i][$this->error];<br>
if(0 == $errorno) {<br>
return 0; //文件正常<br>
} else if(4 == $errorno) {<br>
return 4; //没有上传文件<br>
}<br>
$this->errorMessage .= $this->setErrorMsg($errorno);<br>
<br>
return 99; //文件有错误<br>
}<br>
<br>
/**<br>
* 检查文件大小<br>
* $i 第几个文件<br>
*/<br>
private function isLegalSize($i) {<br>
$fileSize = $this->uploadFileArray[$i][$this->size];<br>
if($fileSize maxsize) {<br>
return true;<br>
}<br>
$this->errorMessage .= $this->setErrorMsg(-2);<br>
return false;<br>
}<br>
<br>
/**<br>
* 检查所给出的文件是否是通过HTTP POST上传的<br>
* $i 第几个文件<br>
*/<br>
private function isUploadedFile($i) {<br>
$tmpName = $this->uploadFileArray[$i][$this->tmp_name];<br>
if(is_uploaded_file($tmpName)) {<br>
return true;<br>
}<br>
$this->errorMessage .= $this->setErrorMsg(-6);<br>
return false;<br>
}<br>
<br>
/**<br>
* 得到新文件名(如果用户指定不用新文件名则使用旧文件名)<br>
*<br>
*/<br>
private function initNewFileName() {<br>
$str = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';<br>
$chars = $this->originalFileName; // 有后缀 .jpg<br>
if($this->israndname) {<br>
$chars = '';<br>
for($i=0; $inewfilenamelength-8; $i++) {<br>
$chars .= substr($str, mt_rand(0, strlen($str)-1), 1);<br>
}<br>
$chars .= date('Ymd', time());<br>
$chars = $chars . '.' . $this->expandedName;<br>
} else {<br>
// 给定了使用指定的名字<br>
if('' != $this->givenfilename) {<br>
$chars = $this->givenfilename . '.' . $this->expandedName;<br>
}<br>
}<br>
<br>
return $chars;<br>
}<br>
<br>
/**<br>
* 复制文件到指定地方<br>
* $i 第几个文件<br>
*/<br>
private function copyFile($i) {<br>
$this->newFileName[$i] = $this->initNewFileName();<br>
<br>
if(is_dir($this->savepath)) {<br>
@move_uploaded_file($this->uploadFileArray[$i][$this->tmp_name], $this->savepath.$this->newFileName[$i]);<br>
} else {<br>
die('上传目录创建失败');<br>
}<br>
}<br>
<br>
/**<br>
* 检查是否有空文件<br>
*/<br>
private function chkEmptyFile(& $arr) {<br>
$flag = 1;<br>
for($i = 0; $i
if(intval($arr[$i][$this->error]) == 4) {<br>
$flag = 4;<br>
break;<br>
}<br>
}<br>
<br>
return $flag;<br>
}<br>
<br>
/**<br>
* 初始化上传文件夹<br>
*/<br>
private function initSavePath() {<br>
$this->savepath = rtrim($this->savepath, '/') . '/';<br>
!empty($this->subdirpattern) && $this->savepath = $this->savepath . date($this->subdirpattern, time()) . '/';<br>
<br>
$tmpSavePath = rtrim($this->savepath, '/');<br>
if(!is_dir($tmpSavePath)) {<br>
$dirs = explode('/', $tmpSavePath);<br>
$realDir = '';<br>
for($i = 0; $i
if($dirs[$i] == '') continue;<br>
if($dirs[$i] == '.') {<br>
$realDir .= './';<br>
} else {<br>
$realDir = $realDir . $dirs[$i] . '/';<br>
}<br>
<br>
if(!is_dir($realDir))<br>
mkdir($realDir);<br>
}<br>
}<br>
}<br>
<br>
/**<br>
* 开始上传文件方法<br>
*/<br>
private function startUpload() {<br>
for($i=0; $i<count>uploadFileArray); $i++) {<br>
if(0 === $this->hasError($i)) {<br>
$this->originalFileName = $this->uploadFileArray[$i][$this->name]; // aa.jpg<br>
$this->expandedName = $this->getExpandedName();<br>
if($this->isLegalExpandedName()) {<br>
if($this->isLegalSize($i)) {<br>
//if($this->isUploadedFile($i)) {<br>
$this->copyFile($i);<br>
//}<br>
}<br>
}<br>
}<br>
}<br>
}<br>
<br>
/**<br>
* 上传文件 入口<br>
* $fileField input框的name属性值<br>
*/<br>
public function uploadFile($fileField) {<br>
//检查上传路径<br>
if(true === $this->emptySavePath()) {<br>
return false;<br>
}<br>
<br>
if(0 !== count($_FILES)) {<br>
//重新排列上传文件<br>
$this->uploadFileArray = $this->reSortFile($_FILES[$fileField]);<br>
<br>
//开始上传文件<br>
if( !$this->ignoreemptyfile && 4 == $this->chkEmptyFile($this->uploadFileArray) ) {<br>
die('强制全部上传模式');<br>
<br>
} else {<br>
$this->initSavePath(); // 初始化上传路径<br>
$this->startUpload();<br>
}<br>
}<br>
}<br>
<br>
/**<br>
* de到错误信息 <br>
*/ <br>
public function getErrorMsg() {<br>
return $this->errorMessage;<br>
}<br>
<br>
public function getUploadFileName() {<br>
foreach($this->newFileName as $key=>$val) {<br>
$this->newFileName[$key] = $this->savepath . $this->newFileName[$key];<br>
}<br>
return $this->newFileName;<br>
}<br>
}<br>
<br>
?></count>
FileUpload.rar
( 3.89 KB 下载:205 次 )
AD:真正免费,域名+虚机+企业邮箱=0元

了解Python编程的入门级代码示例Python是一种简单易学,功能强大的编程语言。对于初学者来说,了解Python编程的入门级代码示例是非常重要的。本文将为您提供一些具体的代码示例,帮助您快速入门。打印HelloWorldprint("HelloWorld")这是Python中最简单的代码示例。print()函数用于将指定的内容输出

PHP变量存储程序运行期间的值,对于构建动态且交互式的WEB应用程序至关重要。本文将深入探讨php变量,并通过10个真实的示例展示它们的实际应用。1.存储用户输入$username=$_POST["username"];$passWord=$_POST["password"];此示例从表单提交中提取用户名和密码,并将其存储在变量中以供进一步处理。2.设置配置值$database_host="localhost";$database_username="username";$database_pa

标题:从入门到精通:Go语言中常用数据结构的代码实现数据结构在编程中起着至关重要的作用,它是程序设计的基础。在Go语言中,有许多常用的数据结构,掌握这些数据结构的实现方式对于成为一名优秀的程序员至关重要。本文将介绍Go语言中常用的数据结构,并给出相应的代码示例,帮助读者从入门到精通这些数据结构。1.数组(Array)数组是一种基本的数据结构,是一组相同类型

《Go语言编程实例:Web开发中的代码示例》随着互联网的快速发展,Web开发已经成为各行业中必不可少的一部分。作为一门功能强大且性能优越的编程语言,Go语言在Web开发中越来越受到开发者们的青睐。本文将通过具体的代码示例,介绍如何利用Go语言进行Web开发,让读者能够更好地理解和运用Go语言来构建自己的Web应用。1.简单的HTTP服务器首先,让我们从一个

如何使用PHP编写库存管理系统中的库存分仓管理功能代码库存管理是许多企业中不可或缺的一部分。对于拥有多个仓库的企业来说,库存分仓管理功能尤为重要。通过合理管理和跟踪库存,企业可以实现不同仓库之间的库存调拨,优化运营成本,改善协同效率。本文将介绍如何使用PHP编写库存分仓管理功能的代码,并为您提供相关的代码示例。一、建立数据库在开始编写库存分仓管理功能的代码之

Java冒泡排序最简单的代码示例冒泡排序是一种常见的排序算法,它的基本思想是通过相邻元素的比较和交换来将待排序序列逐步调整为有序序列。下面是一个简单的Java代码示例,演示了如何实现冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

华为云边缘计算对接指南:Java代码示例快速实现接口随着物联网技术的快速发展和边缘计算的兴起,越来越多的企业开始关注边缘计算的应用。华为云提供了边缘计算服务,为企业提供了高可靠的计算资源和便捷的开发环境,使得边缘计算应用更加容易实现。本文将介绍如何通过Java代码快速实现华为云边缘计算的接口。首先,我们需要准备好开发环境。确保你已经安装了Java开发工具包(

Java选择排序法代码编写指南及示例选择排序是一种简单直观的排序算法,其思想是每次从未排序的元素中选择最小(或最大)的元素进行交换,直到所有元素排序完成。本文将提供选择排序的代码编写指南,并附上具体的Java示例代码。算法原理选择排序的基本原理是将待排序数组分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。重复上述


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

Dreamweaver Mac版
시각적 웹 개발 도구

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기
