用AJAX做文件上传功能效果图:
用AJAX做文件上传功能前端源码:
实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>文件上传练习</title> <style type="text/css"> form { width: 500px; } button { width: 100px; height: 30px; cursor: pointer; border: none; background-color: skyblue; color: white; } button:hover { background-color: orangered; color: white; font-size:1.1em; } </style> </head> <body> <!-- $_SERVER['PHP_SELF']:当前php脚本 --> <!-- enctype="multipart/form-data" :允许通过表单上传文件--> <!-- method:请求类型必须是POST --> <!-- 处理脚本的三种语法: 1. 最严格的写法:$_SERVER['PHP_SELF']:建议实际工作中用htmlspecialchars()进行防跨域攻击处理 "<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" 2. 最死板的写法,直接写上当前文件名: demo6.php 3. 最懒的写法: 空,啥与不写,默认就是提交到当前页面的php脚本处理 --> <form action="upload.php" method="POST" enctype="multipart/form-data"> <!-- 用隐藏域设置允许上传的文件大小:MAX_FILE_SIZE 按字节计算 --> <input type="hidden" name="MAX_FILE_SIZE" value="542488"> <fieldset> <legend align="center">上传文件</legend> <p align="center"><strong>请选择文件:</strong><input type="file" name="upload"></p> </fieldset> <p align="left"><button type="submit" name="submit" id="sub">上传</button></p> </form> <script type="text/javascript" src="../js/jquery.js"></script> <script type="text/javascript"> $('#sub').click(function(){ var data = new data($('form')[0]); data.append('file',$(':file')[0].files[0]); $.ajax({ //请求外部资源 url:'upload.php', //客户端请求类型:GET,POST... dataType: "POST", data: data, cache: false,//上传文件无需缓存 processData: false,//用于对data参数进行序列化处理 这里必须false contentType: false, //必须 success: function (data) { console.log(data); $('#btu span').empty(); $('#btu').append(data); // $.post('upload.php?upload=sub','sub='+$('#sub').val(),function(data){ // switch(data){ // case 0: // case 1: // case 2: // case 3: // $('p').find('span').remove() // $('#sub').after('<span>').next().text(data.msg).css('color','red').prev().focus(); // break; // case 4: // $('p').find('span').remove() // $('#sub').after('<span>').next().text(data.msg).css('color','green') // } // },'json') } }) }) </script> </body> </html>
运行实例 »
点击 "运行实例" 按钮查看在线实例
用AJAX做文件上传功能后台源码:
实例
<meta charset="UTF-8"> <?php //检测请求类型是否POST,如果不是应该提示用户类型不对 if ($_SERVER['REQUEST_METHOD'] == 'POST') { //检测是否有文件上传 if (isset($_FILES['upload'])){ //设置允许上传的文件类型 $IMG = ['image/jpg','image/jpeg','image/png','image/gif']; if (in_array($_FILES['upload']['type'], $IMG)) { //先手动在服务器端创建临时目录,,再将文件移动到临时目录 优化服务器 if (move_uploaded_file($_FILES['upload']['tmp_name'], "UPTMP/{$_FILES['upload']['name']}")){ //上传成功 // echo "<span>'文件上传成功'</span>"; echo "<script>alert('文件上传成功')</script>"; } }else { //提示格式不对 // echo "<span>'仅允许上传jpg和png格式的图片'</span>"; echo "<script>alert('仅允许上传jpg和png格式的图片')</script>"; } } } /*错误信息处理*/ if ($_FILES['upload']['error'] > 0 ) { echo '<p>错误原因是:<strong>'; switch ($_FILES['upload']['error']) { case 1: echo '文件超过了php.ini配置中设置的大小'; break; case 2: echo '文件超过了表单中常量设置的大小'; break; case 3: echo '仅有部分文件被上传'; break; case 4: echo '没有文件被上传'; break; case 6: echo '没有可用的临时文件夹'; break; case 7: echo '磁盘已满,写入失败'; break; case 8: echo '上传意外中止'; break; default: echo '系统未知错误'; break; } echo '</strong></p>'; //保险起见,最好把创建的临时文件删除,当然系统也会在结束会话时自动清空 if (file_exists($_FILES['upload']['tmp_name']) && is_file($_FILES['upload']['tmp_name'])) { unlink($_FILES['upload']['tmp_name']); } } ?>
运行实例 »
点击 "运行实例" 按钮查看在线实例
PHP文件处理知识点:
1.创建或打开一个本地文件:
以r(只读)方式打开文件,不会创建新文件, 类似: r+(读写),指针在开头
// $fh = fopen('file1.txt', 'r') or die("不能打开file1.txt文件");
以w(只写)方式打开文件,如文件不存在则创建, 类似: w+(读写),指针在开头
$fh = fopen('file2.txt', 'w') or die("不能打开file2.txt文件");
以a(追加只写)方式打开文件,如文件不存在则创建, 类似: a+(追加读写),指针在未尾
$fh = fopen('file3.txt', 'a') or die("不能打开file3.txt文件");
//注: 在windows机器上建议读写模式符添加b,以增强对二进制文件的兼容性,如rb,wb...
2.打开一个远程文件
$fh = fopen('http://www.php.cn/course/801.html', 'r');
3.读取文件到浏览器
//从文件指针处读取一行并自动下移
while ($s = fgets($fh)) { print $s; }
//fgetss()可过滤掉所有的html标签
while ($s = fgetss($fh)) { print $s; }
4. 读取文件到字符串:
file_get_contens($filename)返回字符串 $content = file_get_contents('file.txt');
//将整个页面读入到一个字符串,这在抓取其它网站内容时很有用,配合过滤正则
$content = file_get_contents('http://www.php.cn'); echo '文件大小: '.strlen($content).' 字节', '<br>'; if (strlen($content) > 0) { echo $content; }
5. 把整个文件读入到数组中,用换行符进行分割
$arr = file('maxim.txt'); foreach ($arr as $key => $value) { echo '<span style="color:red">格言'.($key+1).': </span>'.$value.'<hr>'; } shuffle($arr),随机打乱一个数组,返回true/false if (shuffle($arr)) { echo current($arr); //随机显示一条格言 echo $arr[0]; //随机显示一条格言 } echo '<hr>';
//array_rand($arr,$length=1):从数组随机取出一个或多个元素
//取出一个只返回键名,多个则返回随机键名数组
echo $arr[array_rand($arr)]; print_r(array_rand($arr,3));//返回三个随机的键名 echo '<hr>';
// 遍历这个键名数组,查询出对应的数组元素值
$kes = array_rand($arr,3); foreach ($kes as $value) { //键名无意义,我们只关心值,即键名 print $arr[$value].'<hr>'; }
//文件读写完成后,应该及时关闭
fclose($fh);
//关闭脚本后,文件也会自动关闭,但还是强烈推荐手工显示式关闭,这是一个好习惯
目录遍历操作:
1. 传统过程函数: opendir(),readdir(),closedir()
2. 目录扫描器: scandir()
* 第一种方式: 传统目录函数
* 第一步: opendir('目录')打开目录,成功返回资源,失败返回false
* 第二步: readdir($dir)读取目录内容,世功返回文件名,失败返回false
* 第三步: closedir($dir)关闭当前目录
$dir = opendir('../0418') or die('打开失败'); // $dir = opendir('./') or die('打开失败'); //.或./当前目录 while (false != ($file = readdir($dir))) { // print $file."<br>"; // print nl2br($file."\n"); if ($file != "." && $file != "..") { print $file."<br>"; } } closedir($dir); echo '<hr>';
* 第二种方式:将目录内容保存到数组中进行遍历
* 第一步:scandir($dir)将目录转数组中保存
* 第二步:遍历目录数组
//读到一个目录内容到数组中: $fileArr = scandir('../0417/'); // print_r($fileArr); foreach ($fileArr as $file) { if ($file != "." && $file != "..") { echo "$file<br>"; } }
//说明: 如果想要递归所有目录,要编写自定义函数来解决,我们介绍一种更方便的递归遍历技术
目录迭代器:DirectoryInterator
目录递归迭代器:RecursiveDirectoryIterator
* 第一种方式: DirectorInterator:
* 第一步: 实例化目录对象
* 第二步: 遍历目录
$dir = new DirectoryIterator('../0416'); foreach ($dir as $file) { // print $file->getPathname()."<br>"; // print nl2br($file->getPathname()."\n"); //如果不想显示那个./..目录文件,可以做一个判断,只显示普通文件 // if($file->isFile()){ //除./..外,目录文件也会过滤掉 // print $file->getPathname()."<br>"; // }
//发现没有将子目录的遍历出来,实际开发中,我们经常需要获取到全部的文件信息
* 第二种方式:
* 1. RecursiveDirectoryIterator 递归目录迭代器
* 2. RecursiveIteratorIterator 重复递归迭代器
$dir = new RecursiveDirectoryIterator('../0416'); foreach (new RecursiveIteratorIterator($dir) as $file) { // print $file->getPathname()."<br>"; if ($file->isFile()) { //只显示文件 print $file->getPathname()."<br>"; } } echo '<hr>';
一.分解文件名
//系统常量__FILE__
echo __FILE__,'<br>';
1.获取文件名
echo '文件名: '.basename(__FILE__).'<br>';
2.获取目录名
echo '目录名: '.dirname(__FILE__).'<br>';
//php5.3+推荐使用常量__DIR__代替dirname()
echo __DIR__, '<br>';
3.pathinfo():将目录名,文件名,扩展或解析到一个数组中
$pathinfo = pathinfo(__FILE__); echo '目录名:', $pathinfo['dirname'],'<br>'; echo '文件名:', $pathinfo['basename'],'<br>'; echo '扩展名:', $pathinfo['extension'],'<br>';
php中没有提供将这三个部分组成一个完整文件名的函数
因为windows与unix上的目录分隔符不同
windows是正斜线:/ , unix/linux上的是反斜线\
所以系统提供一个常量:DIRECTORY_SEPARATOR,可以根据系统自动确定路径分隔符类型
$path = dirname(__FILE__).DIRECTORY_SEPARATOR.basename(__FILE__); echo $path,'<br>'; var_dump($path==__FILE__); //此处, $path与__FILE__完全相同
删除文件:unlink(file)
unlink('temp.php') or die ('删除失败');
复制copy(old, new)
copy('maxim.txt', '../0419/maxim01.txt') or die('复制失败');
更名:rename(old,new):二个参数在同一目录下
rename('maxim01.txt', 'maxim02.txt') or die('移动失败');
移动:rename(old,new):二个参数在不同的目录下
rename('file3.txt', __DIR__.'/../0418/file3.txt') or die('移动失败'); rename('file2.txt', '../0418/file2.txt') or die('移动失败');
创建目录: mkdir(dirname)
mkdir('admin'); rename('file.txt', 'admin/file.txt') or die('移动失败');
删除目录//先清空目录
unlink('admin/file.txt'); rmdir('admin');