这片笔记讲php文件上传的功能及遇到的一些问题。
先看php文件:
<?php
header("Content-type:text/html;charset=utf-8");
$backinfo = '';
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]); // 将文件名打散为数组,以‘.’为分隔符
$extension = end($temp); // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif") //判断文件的格式
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小于 200 kb
&& in_array($extension, $allowedExts)) //在$allowedExts中查找是否含有上传文件的后缀名$extension
{
if ($_FILES["file"]["error"] > 0) //$_FILES["file"]["error"]>0:有错
{
$backinfo = "错误:: " . $_FILES["file"]["error"] . "<br>";
} else{
// 如果没有 upfiles 目录,你需要创建它,upfiles 目录权限为 777
$dir = iconv("UTF-8", "GBK", "../upfiles");
if (!file_exists($dir)){
mkdir ($dir,0777,true);
}
// 判断当期目录下的 upfiles 目录是否存在该文件
if (file_exists("../upfiles/" . $_FILES["file"]["name"]))
{
$backinfo = $_FILES["file"]["name"] . " 文件已经存在。 ";
}
else
{
// 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
move_uploaded_file($_FILES["file"]["tmp_name"], "../upfiles/" . $_FILES["file"]["name"]);
$backinfo = $_FILES["file"]["name"] ."文件已上传";
}
}
}
else
{
$backinfo = "非法的文件格式";
}
echo sprintf($backinfo);
相关知识点:
1.$_FILES["file"]["name"]:文件名称
2.$_FILES["file"]["type"]:文件格式
3.
$_FILES["file"]["size"]:文件大小
4.$_FILES["file"]["error"]:文件错误代码
0:表示没有错误,下面几种对应不同的错误
1 : 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值.
2 : 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。
3 : 文件只有部分被上传
4 : 没有文件被上传
$_FILES["file"]["error"] >0就是表示有错误发生
5.
$_FILES["file"]["tmp_name"]:文件临时存储位置
6.
explode(separator,string,limit)函数:把字符串打散为数组
separator:必需。规定在哪里分割字符串。
string:必需。要分割的字符串。
limit:可选。规定所返回的数组元素的数目。
可能的值:
大于 0 - 返回包含最多 limit 个元素的数组
小于 0 - 返回包含除了最后的 -limit 个元素以外的所有元素的数组
0 - 返回包含一个元素的数组
7.end()函数:输出数组中最后一个值
相关:
current()-返回数组中的当前元素的值
next()-将内部指针指向数组中的下一个元素,并输出
prev()-将内部指针指向数组中的上一个元素,并输出
reset()-将内部指针指向数组中的第一个元素,并输出
each()-返回当前元素的键名和键值,并将内部指针向前移动
示例:
<?php
$people = array("Bill", "Steve", "Mark", "David");
echo current($people) . "<br>"; // 当前元素是 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
echo current($people) . "<br>"; // 现在当前元素是 Steve
echo prev($people) . "<br>"; // Steve 的上一个元素是 Bill
echo end($people) . "<br>"; // 最后一个元素是 David
echo prev($people) . "<br>"; // David 之前的元素是 Mark
echo current($people) . "<br>"; // 目前的当前元素是 Mark
echo reset($people) . "<br>"; // 把内部指针移动到数组的首个元素,即 Bill
echo next($people) . "<br>"; // Bill 的下一个元素是 Steve
print_r (each($people)); // 返回当前元素的键名和键值(目前是 Steve),并向前移动内部指针
?>
8.in_array(search,array,type)函数:搜索数组中是否存在指定的值
search:必需。规定要在数组搜索的值。
array: 必需。规定要搜索的数组。
type: 可选。如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
9.iconv():iconv方法是为了防止中文乱码,保证可以创建识别中文目录,不用iconv方法格式的话,将无法创建中文目录
10.file_exists(path) :函数检查文件或目录是否存在,如果指定的文件或目录存在则返回 true,否则返回 false。
11.mkdir(path,mode,recursive,context):函数创建目录,若成功,则返回true,否则返回false。
path:必需。规定要创建的目录的名称及路径。
mode:必需。规定权限。默认是0777。
recursive:必需。规定是否设置递归模式。
context:必需。规定文件句柄的环境。Context是可修改流的行为的一套选项。
12.move_uploaded_file(file,newloc):将上传的文件移动到新位置。
file:必需。规定要移动的文件。
newloc:必需。规定文件的新位置。
接下来看一下两种方式的做法:
一、form表单上传
使用form上传时,enctype属性值必须为multipart/form-data。
html:
<form action="php/upload.php" method="post" enctype="multipart/form-data" >
<input type="file" id="form-file" name="file">
<input type="submit" value="上传">
</form>
结果:
二、ajaxFileUpload.js插件上传
先得引用ajaxFileUpload.js:<script src="js/1.9.1jquery.min.js"></script>
<script src="js/ajaxfileupload.js"></script>
html:
<input type="file" id="file" name="file">
<input type="button" id="file-btn" value="上传">
js:
$("#file-btn").click(function () {
$.ajaxFileUpload ({
url:'./php/upload.php',
secureuri:false, //是否启用安全提交,默认为false。
fileElementId:'file',//与页面处理代码中file相对应的ID值
dataType: 'text', //返回数据类型:text,xml,json,html,scritp,jsonp五种
success: function (data) {
alert(data);
}
})
})
结果:
使用ajaxFileUpload.js遇到的问题:
“jQuery.handleError is not a function”
网上查找了一下这个错误的原因:版本1.4.2之前的版本才有handlerError方法。
解决办法:在ajaxFileUpload.js文件开头添加这一段代码(红色代码):
handleError: function( s, xhr, status, e ) {
// If a local callback was specified, fire it
if ( s.error ) {
s.error.call( s.context || s, xhr, status, e );
}
// Fire the global callback
if ( s.global ) {
(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
}
},
createUploadIframe: function(id, uri){...}