php 文件上传
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】php
[
20 瀏覽
0 評論
7 贊
6 踩
]
概要
正文
参考了菜鸟教程的代码,封装了一下上传文件的模块。
注意事项:建议在 utf-8 编码下运行,gbk 的没测试,可能会出现问题。
还有:如果设置将上传的文件保存到某一文件夹,请事先创建好这个文件夹。
使用方式:创建 control_upload_file.php
写入如下代码
<?php /* * control_upload_file.php * 文件上传模块 * * 源码转自菜鸟教程,有改动。 * * 此模块调用方式:使用 iframe 标签加载此页面, * 并使用 session 变量指定参数。 * */ session_start(); /* * $_SESSION 变量 * control_upload_file_exts * 字符串数组,存储所有支持上传的文件的扩展名,如果数组的第一项是 '*' 则表示支持所有文件 * control_upload_file_max_size * 指定上传的文件最大大小,单位须指定 * control_upload_file_size_unit * 指定 control_upload_file_max_size 的单位,可以是 "byte","kb","mb","gb" 中的其一,不区分大小写。 * control_upload_file_save_path * 指定上传的文件的存储路径。注意:如果是相对路径,则是相对于此文件而言的。 * control_upload_file_allow_repeat * 指定是否允许上传重复名称的文件,如果允许则会将重复的名称进行修改,否则会输出错误。此变量只允许布尔值。 * control_upload_file_name * 存储上传的文件的名称 * control_upload_file_type * 存储上传的文件的类型 * control_upload_file_size * 存储上传的文件的大小,单位为字节 * control_upload_file_temp_path * 存储上传的文件被临时存储的位置 * control_upload_file_state * 存储当前上传文件的状态 * 0 - 没有收到文件上传指令 * 1 - 文件成功上传 * 2 - 文件上传失败,后缀名不符合要求 * 3 - 文件上传失败,文件大小超过限制 * 4 - 重复的文件名(如果不允许上传重复名称的文件) * 文件上传中遇到错误:此时变量存储的是错误信息字符串。 * 此变量默认值为 0,在第一次上传文件之后就会发生更改,不会自动归零,需要手动修改。 */ ?> <html> <head> <meta charset="utf-8"> </head> <body> <form method="post" enctype="multipart/form-data"> <label for="file">要上传的文件:</label> <input type="file" name="file" id="file"></input> <br/> <button name="button" value="submit"> 提交(提交后等待提示上传完成) </button> </form> </body> </html> <?php // 未提交表单 if($_POST['button'] != "submit") { return; } // 未选择文件 if(empty($_FILES["file"]["name"])) { echo "<script>alert('请先选择文件。');</script>"; return; } $allowedExts = $_SESSION['control_upload_file_exts']; $max_size = $_SESSION['control_upload_file_max_size']; $unit = strtolower($_SESSION['control_upload_file_size_unit']); $path = $_SESSION['control_upload_file_save_path']; // 单位转换 switch($unit) { case "kb": $max_size = $max_size * 1024; break; case "mb": $max_size = $max_size * 1048576; break; case "gb": $max_size = $max_size * 1073741824; break; } // 获取文件后缀名 $extension = end(explode(".", $_FILES["file"]["name"])); // 后缀名不符合要求 if($allowedExts[0] != "*" && !in_array($extension, $allowedExts)) { $_SESSION['control_upload_file_state'] = 2; return; } // 文件大小超过限制 if($_FILES["file"]["size"] > $max_size) { $_SESSION['control_upload_file_state'] = 3; return; } // 文件上传遇到错误 if ($_FILES["file"]["error"] > 0) { $_SESSION['control_upload_file_state'] = $_FILES["file"]["error"]; return; } $_SESSION['control_upload_file_type'] = $_FILES["file"]["type"]; $_SESSION['control_upload_file_size'] = $_FILES["file"]["size"]; $_SESSION['control_upload_file_temp_path'] = $_FILES["file"]["tmp_name"]; // 转换编码 $file_name_gbk = iconv("UTF-8", "GB2312", $_FILES["file"]["name"]); $_SESSION['control_upload_file_save_path'] = iconv("UTF-8", "GB2312", $_SESSION['control_upload_file_save_path']); // 若文件名重复,则修改到不重复为止。 while (file_exists($_SESSION['control_upload_file_save_path'].$file_name_gbk)) { if(!$_SESSION['control_upload_file_allow_repeat']) { $_SESSION['control_upload_file_state'] = 4; return; } $file_name_gbk = substr_replace($file_name_gbk,"_(repeat)",strrpos($file_name_gbk,"."),0); } // 转换编码 $file_name_utf8 = iconv("gbk", "utf-8", $file_name_gbk); $_SESSION['control_upload_file_name'] = $file_name_utf8; // 上传文件 move_uploaded_file($_FILES["file"]["tmp_name"], $_SESSION['control_upload_file_save_path'].$file_name_gbk); $_SESSION['control_upload_file_state'] = 1; echo "<script>alert('您上传的文件:\\n文件名:{$file_name_utf8}\\n大小:".($_FILES["file"]["size"] / 1048576)." MB\\n\\n文件上传完成!~~~');</script>"; ?>
调用方式:在用户页面使用 iframe 标签加载这个 php 页面即可,但是前提要设置参数,详见代码注释。
调用示例:
<?php session_start(); // 配置参数 $_SESSION['control_upload_file_exts'] = array("*"); $_SESSION['control_upload_file_max_size'] = 512; $_SESSION['control_upload_file_size_unit'] = "MB"; $_SESSION['control_upload_file_save_path'] = "./upload/"; $_SESSION['control_upload_file_allow_repeat'] = true; ?> <iframe width=300px height=100px src="./control_upload_file.php"></iframe>
这个例子中没有获取上传的文件的信息。
更完整的使用示例可以参考 https://github.com/zouhuidong/simple_chat 项目,其中使用了这个模块。