上传多个文件的PHP脚本


Posted in PHP onNovember 26, 2006

译者注:本文的原名是《Creating a Multi-File Upload Script in PHP》。我个个觉得这文章写得一般,代码也不是非常专业,但是它比较短,而且一时间也找不到好一点的文章,就把这个译过来了。其实PHP手册里也有一节是说多文件上传的,大家可以对比对比。文章内有的字句译出来不太顺眼,所以按照原意作了一定量的修改。本人水平有限,还望各位高手多指点。 

导言

作为一个PHP的程序员,我曾遇到过这么一个客户,他需要一个可以同时上传多个文件的表单。因此,一天夜里我就用了一个小时的时间,找到了最好最简单的方法来完成这个要求。在这篇教程里,“for”这个循环语句,将会成为核心代码。

脚本1:让用户设定需要上传的文件数目

uploadForm1.php

<html>
<head>
<title>文件上传</title>
</head>
<body>
<form name="form1" method="post" action="uploadForm2.php">
  <p>请输入你要同时上传的文件的数目,最大值是9</p>
  <p>
    <input name="uploadNeed" type="text" id="uploadNeed" maxlength="1">
  </p>
  <p>
    <input type="submit" name="Submit" value="Submit">
  </p>
</form>
</body>
</html>

上面的HTML代码非常简单。在这段代码里,我把uploadNeed这个组件的maxlength属性设为1,那么用户所能输入的最大值就是9了。当然,你可以根据需要自行修改这部份。

脚本2:创建动态表单

好了,做好下面的这个页面以后,我们就完成全部工作的一半了。我们用for循环语句来完成这个任务。

uploadForm2.php

<html>
<head>
<title>文件上传</title>
</head>
<body>
<form name="form1" enctype="multipart/form-data" method="post" action="processFiles.php">
  <?php
  // 创建动态表单
  $uploadNeed = $_POST['uploadNeed'];
  for($x=0;$x<$uploadNeed;$x++){
  ?>
    <input name="uploadFile<?php echo $x;?>" type="file" id="uploadFile<?php echo $x;?>">
  <?php
  // 完成循环
  }
  ?>
  <input name="uploadNeed" type="hidden" value="<?php echo $uploadNeed;?>">
    <input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>

在这个页面里,我只是创建了一个带有“type”属性的HTML表单。在表单中间,我插入了一段PHP代码来完成循环。我把$x设为0并且把循环次数设为所需要的值$uploadNeed(就是刚才用户提交的那个值)。我还把$uploadNeed的值输出到hidden域里,以便它能传递到最后的一个页面。

作这些工作的目的是为了把$x这个变量的值,加在“name”属性的值“uploadFile”的后面。这样每个“name”属性的值“uploadFile”的后面都会有一个不同的数字来区别第一个文件。

脚本3:处理上传文件

现在就来完成上传文件的最后一步

processFiles.php

<?php
$uploadNeed = $_POST['uploadNeed'];
// 开始循环
for($x=0;$x<$uploadNeed;$x++){
$file_name = $_FILES['uploadFile'. $x]['name'];
// 去除文件名中的特殊字符
$file_name = stripslashes($file_name);
$file_name = str_replace("'","",$file_name);
$copy = copy($_FILES['uploadFile'. $x]['tmp_name'],$file_name);
// 检查是否复制成功
if($copy){
echo "$file_name 上传成功<br />";
}else{
echo "$file_name 上传失败<br />";
}
} // 结束循环
?>

在这个脚本里,我们首先要从uploadForm2.php中获取$uploadNeed这个变量。和前页那个页面一样,我们用“for”语句来还创建循环。不同的时,我们需要在循环内使用预定义全局变量$_FILES,我把它传递给了$file_name这个变量。

下一步,我们调用了stripslashes和str_replace两个函数来处理。由于文件名内可能包含一些特殊字符,所以我们使用stripslashes函数来防止上传时出现解释错误。

注意我是如何添加$x这个变量的,在$_FILES里$x会变成数字。这样程序就会知道得处理哪个文件了。

当我们使用copy函数时,才真正的开始把上传的文件复制到指定目前内。最后还加上了一段简单的代码来判断复制是否成功,并把结果输出到屏幕上。

结束语

我肯定这个小小的脚本会使你一次上传多个文件的工作变得更方便。你可以根据下列的提示,在这个脚本内加入相关的代码来完善它。

把文件名保存在MySQL数据库中 
获取文件的大小并保存到数据库中 
创建一个临时文件保存上传失败的文件的文件名,并在程序执行完以后再试尝试 
添加批量删除文件的功能

PHP 相关文章推荐
从网上搜到的phpwind 0day的代码
Dec 07 PHP
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
PHP的开发框架的现状和展望
Mar 16 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
解析PHP提交后跳转
Jun 23 PHP
php实现图片缩略图的方法
Mar 29 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
Dec 20 PHP
使PHP自定义函数返回多个值
Nov 26 #PHP
PHP中for循环语句的几种变型
Nov 26 #PHP
用PHP中的 == 运算符进行字符串比较
Nov 26 #PHP
PHP图片上传类带图片显示
Nov 25 #PHP
整合了前面的PHP数据库连接类~~做成一个分页类!
Nov 25 #PHP
PHP面向对象的使用教程 简单数据库连接
Nov 25 #PHP
xajax写的留言本
Nov 25 #PHP
You might like
php数组总结篇(一)
2008/09/30 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
php事务处理实例详解
2014/07/11 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP反射学习入门示例
2019/06/14 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
面向对象设计模式的核心法则
2013/11/10 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
JS实现网页上随机产生超链接地址的方法
2015/11/09 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
[01:05:12]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS CIS-GAME
2014/05/21 DOTA
[49:21]TNC vs VG 2019DOTA2国际邀请赛淘汰赛 胜者组赛BO3 第三场 8.20.mp4
2019/08/22 DOTA
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
Python切片知识解析
2016/03/06 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
深入浅析pycharm中 Make available to all projects的含义
2020/09/15 Python
医院营销工作计划
2015/01/16 职场文书
Python基础之Socket通信原理
2021/04/22 Python
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
Python实现的扫码工具居然这么好用!
2021/06/07 Python
浅谈克隆 JavaScript
2021/11/02 Javascript
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android