博客列表 >419-PHP文件上传

419-PHP文件上传

小威的博客
小威的博客原创
2018年04月20日 19:55:24933浏览
  • 用AJAX做文件上传功能效果图:

0419.png

  • 用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).':&nbsp;</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');


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议