在网上看到一个比较好的多文件上传类,自己改良了下,顺便用js实现了多文件浏览,php文件上传原理都是相同的,多文件上传也只是进行了循环上传而已,当然你也可以使用swfupload进行多文件上传!

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script language="javascript" type="text/javascript">
function AddInput(){
var input=document.createElement('input');//创建一个input节点
var br=document.createElement('br');//创建一个br节点
input.setAttribute('type','file');//设置input节点type属性为file
input.setAttribute('name','files[]');//设置input节点name属性为files[],以 数组的方式传递给服务器端
document.myForm.appendChild(br);//把节点添加到form1表单中
document.myForm.appendChild(input);
}
</script>
</head>
<body>
<?php
/*
* 尊重作者:mckee 来自www.phpddt.com
* 可同时处理用户多个上传文件。效验文件有效性后存储至指定目录。
* 可返回上传文件的相关有用信息供其它程序使用。(如文件名、类型、大小、保存路径)
*/
class UploadFile { protected $user_post_file = array(); //用户上传的文件
protected $save_file_path; //存放用户上传文件的路径
protected $max_file_size; //文件最大尺寸
protected $last_error; //记录最后一次出错信息
//默认允许用户上传的文件类型
protected $allow_type = array('gif', 'jpg', 'png', 'zip', 'rar', 'txt', 'doc', 'pdf','docx');
protected $final_file_path; //最终保存的文件名
protected $save_info = array(); //返回一组有用信息,用于提示用户。 /**
* 构造函数
*/
function __construct($file, $path, $size = 2097152, $type = '') {
$this->user_post_file = $file;
if(!is_dir($path)){ //存储路径文件不存在就创建
mkdir($path);
chmod($path,0777);
}
$this->save_file_path = $path;
$this->max_file_size = $size; //如果用户不填写文件大小,则默认为2M.
if ($type != '')
$this->allow_type = $type;
} /**
* 存储用户上传文件,检验合法性通过后,存储至指定位置。
*/
function upload() { for ($i = 0; $i < count($this->user_post_file['name']); $i++) {
//如果当前文件上传功能,则执行下一步。
if ($this->user_post_file['error'][$i] == 0) {
//取当前文件名、临时文件名、大小、扩展名,后面将用到。
$name = $this->user_post_file['name'][$i];
$tmpname = $this->user_post_file['tmp_name'][$i];
$size = $this->user_post_file['size'][$i];
$mime_type = $this->user_post_file['type'][$i];
$type = $this->getFileExt($this->user_post_file['name'][$i]);
//检测当前上传文件大小是否合法。
if (!$this->checkSize($size)) {
$this->last_error = "The file size is too big. File name is: ".$name;
$this->halt($this->last_error);
continue;
}
//检测当前上传文件扩展名是否合法。
if (!$this->checkType($type)) {
$this->last_error = "Unallowable file type: .".$type." File name is: ".$name;
$this->halt($this->last_error);
continue;
}
//检测当前上传文件是否非法提交。
if(!is_uploaded_file($tmpname)) {
$this->last_error = "Invalid post file method. File name is: ".$name;
$this->halt($this->last_error);
continue;
}
//移动文件后,重命名文件用。
$basename = $this->getBaseName($name, ".".$type);
//为防止文件名乱码
$basename = iconv("UTF-8","gb2312", $basename);
//移动后的文件名
$saveas = $basename.time().".".$type;
//组合新文件名再存到指定目录下,格式:存储路径 + 文件名 + 时间 + 扩展名
$this->final_file_path = $this->save_file_path."/".$saveas;
if(!move_uploaded_file($tmpname, $this->final_file_path)) {
$this->last_error = $this->user_post_file['error'][$i];
$this->halt($this->last_error);
continue;
}
//存储当前文件的有关信息,以便其它程序调用。
$this->save_info[] = array("name" => $name, "type" => $type,
"mime_type" => $mime_type,
"size" => $size, "saveas" => $saveas,
"path" => $this->final_file_path);
}
}
return count($this->save_info); //返回上传成功的文件数目
} /**
* 返回一些有用的信息,以便用于其它地方。
*/
function getSaveInfo() {
return $this->save_info;
} /**
* 检测用户提交文件大小是否合法
*/
function checkSize($size) {
if ($size > $this->max_file_size) {
return false;
}
else {
return true;
}
} /**
* 检测用户提交文件类型是否合法
*/
function checkType($extension) {
foreach ($this->allow_type as $type) {
if (strcasecmp($extension , $type) == 0)
return true;
}
return false;
} /**
* 显示出错信息
*/
function halt($msg) {
printf("<b><UploadFile Error:></b> %s <br>\n", $msg);
} /**
* 取文件扩展名
*/
function getFileExt($filename) {
$stuff = pathinfo($filename);
return $stuff['extension'];
}
/**
* 取给定文件文件名,不包括扩展名。
*/
function getBaseName($filename, $type) {
$basename = basename($filename, $type);
return $basename;
}
} if (!empty($_POST['submit'])) {
$upload = new UploadFile($_FILES['files'], './tmp');
//上传用户文件,返回int值,为上传成功的文件个数。
$num = $upload->upload();
if ($num != 0) {
echo "上传成功<br>";
echo $num."个文件上传成功";
}
else {
echo "上传失败<br>";
}
}
?>
<form name="myForm" enctype="multipart/form-data" method="POST" action="">
<input type="file" name="files[]">
<input type="submit" name="submit" value="上传"><a href="#" onclick="AddInput()">再上传一张</a>
</form>
</body>
</html>

运行结果:

php多文件上传类(含示例)的更多相关文章

  1. PHP实现的多文件上传类及用法示例

    这篇文章主要介绍了PHP实现的多文件上传类及用法,详细分析了php实现的多文件上传类与具体的使用技巧,需要的朋友可以参考下 1.upFiles.css.php 文件 <?php class Up ...

  2. ASP.NET 文件上传类 简单好用

    调用: UploadFile uf = new UploadFile(); /*可选参数*/ uf.SetIsUseOldFileName(true);//是否使用原始文件名作为新文件的文件名(默认: ...

  3. PHP 文件上传类

    FileUpload.;                $];                $_newname = date(,). :                             To ...

  4. php 文件上传类 实例分享

    最近在研究php上传的内容,找到一个不错的php上传类,分享下. <?php /** * 文件上传类 * class: uploadFile * edit: www.jbxue.com */ c ...

  5. [上传下载] C#FileUp文件上传类 (转载)

    点击下载 FileUp.zip 主要功能如下 .把上传的文件转换为字节数组 .流转化为字节数组 .上传文件根据FileUpload控件上传 .把Byte流上传到指定目录并保存为文件 看下面代码吧 // ...

  6. ThinkPHP文件上传类

    TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...

  7. C#文件上传类,文件流,字节数组等

    using System;using System.IO;using System.Web;using System.Web.UI.WebControls; namespace DotNet.Util ...

  8. Php文件上传类class.upload.php

    简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮助你快速的给自己的网站集成上传文件功能.不仅如此,此分类还有一些列的处理功能,可以对上传的文件或者本地的文件进行处 ...

  9. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

随机推荐

  1. poj 1821 Fence(单调队列优化DP)

    poj 1821 Fence \(solution:\) 这道题因为每一个粉刷的人都有一块"必刷的木板",所以可以预见我们的最终方案里的粉刷匠一定是按其必刷的木板的顺序排列的.这就 ...

  2. Android Studio解决导入项目非常慢

    Android Studio比Eclipse ADT有巨大的优势.Android Studio原生支持使用Gradle来构建项目,使用动态语言Groovy定义项目构建的过程,避免了build.xml文 ...

  3. 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)

    首先需要明确的是,微信的API都是通过https调用实现的,分为post方法调用和get方法调用.不需要上传数据的采用get方法(例如获取AccessToken),而需要向微信服务器提交数据的采用po ...

  4. hdu2544 迪杰斯特拉题目优化

    点击打开题目链接 迪杰斯特拉的用法不多讲,详见  点击打开链接 . 下面两个代码: 这个是用邻接矩阵存图的迪杰斯特拉. #include<stdio.h> int main() { int ...

  5. solr安装-tomcat+solrCloud构建稳健solr集群

    solrCloud的搭建可以有两种方式:使用solr内嵌的jetty来搭建:使用外部web容器tomcat来搭建.对于使用jett来搭建参考solr官方的手册照着做肯定ok,下面我主要讲的是如何使用t ...

  6. Open multiple excel files in WebBrowser, only the last one gets activated

    http://stackoverflow.com/questions/20578053/open-multiple-excel-files-in-webbrowser-only-the-last-on ...

  7. PYTHON路线图

    路线图: 第一部分:Python语言基础 第二部分:数据库开发 第三部分:web前端 第四部分:Python web开发 第五部分:Python web项目 第六部分:Linux 第七部分:NoSQL ...

  8. Socket教程

    Socket网络编程学习笔记(6):使用线程池提高性能    Socket网络编程学习笔记(5):发送和接收实体类数据   Socket网络编程学习笔记(4):TCP消息边界处理   Socket网络 ...

  9. OC静态代码检查实战

    此文已由作者杨晓授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在Mac OS系统上,采用Xcodebuild Analyze命令和OClint工具,对iOS项目进行静态代码 ...

  10. K

    https://codeforces.com/gym/101982/attachments K 打表暴力 /*#include<bits/stdc++.h> using namespace ...