上传多个文件的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 相关文章推荐
删除数组元素实用的PHP数组函数
Aug 18 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
PHP中文件缓存转内存缓存的方法
Dec 06 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
解析php session_set_save_handler 函数的用法(mysql)
Jun 29 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php中数字、字符与对象判断函数用法实例
Nov 26 PHP
PHP访问Google Search API的方法
Mar 05 PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 PHP
PHP5.6新增加的可变函数参数用法分析
Aug 25 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
使用配置类定义Codeigniter全局变量
2014/06/12 PHP
PHP数组操作类实例
2015/07/11 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
Javascript操作cookie的函数代码
2012/10/03 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
DOM基础教程之使用DOM
2015/01/19 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
JS+CSS3制作炫酷的弹窗效果
2016/11/08 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
2018/11/26 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
js实现unicode码字符串与utf8字节数据互转详解
2019/03/21 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
Python实现分割文件及合并文件的方法
2015/07/10 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
pandas 将索引值相加的方法
2018/11/15 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
校运会口号
2014/06/18 职场文书
办公室主任四风问题对照检查材料思想汇报
2014/09/28 职场文书
公务员年终个人总结
2015/02/12 职场文书
退税申请报告怎么写
2015/05/18 职场文书
消防宣传标语大全
2015/08/03 职场文书
幼儿园教师教学反思
2016/03/02 职场文书
利用Python判断整数是否是回文数的3种方法总结
2021/07/07 Python