### 文件编程
⦁文件编程的必要性
⦁在网站开发中,我们要使用到文件的上传和下载,就是经典的文件编程的使用
⦁文件的基本概念
文件就是保存数据(二进制素具,文本数据),在程序员看来,文件就是数据的来源。
⦁文件流
在对文件进行操作的过程中,我们以流的概念来操作
###
![](https://box.kancloud.cn/2016-06-03_5750fd9103679.jpg)
从该图中我们可以看出,如果你的数据是从程序(内存)向文件(磁盘)流动,则我们成为输出流,反之输入流。
⦁文件-操作的方式
本地操作和远程操作(通过网络)
⦁常用的文件操作函数
⦁获取文件信息函数
~~~
<?php
//文件的基本信息
//1、fopen 打开文件,参数 URL及 打开方式MOde
$file_path = "/var/myphp/file/file.txt";
//该函数返回一个指向文件的指针
//chmod($file_path, 777);
$fp = fopen($file_path, "r+");
if($fp){
//fstat 获得文件的信息
$file_info = fstat($fp);
echo "<pre>";
print_r($file_info);
echo "</pre>";
echo "文件大小".$file_info['size'];
} else{
echo "fopen file error!</br>";
}
//关闭文件!!必须关闭
fclose($fp);
//**获取文件信息第二种方式
echo "<br/>".filesize($file_path);
echo "<br/>".filemtime($file_path);
echo "<br/>".filectime($file_path);
echo "<br/>".fileatime($file_path);
?>
~~~
⦁读文件获得文件内容
###
~~~
<?php
/**
*
* @author jsh
* @version
*/
$file_path = "/var/myphp/file/file.txt";
//该函数返回一个指向文件的指针
/************一种读取方式*************
if(file_exists($file_path)){
if($fp = fopen($file_path,"r+")){
$con = fread($fp, filesize($file_path));
echo "文件的内容是:</br>";
//注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的
//不认\r\n 需要进行下面的替换
$con1 = str_replace("\n", "</br>", $con);
echo $con1;
}else{
echo "file open error!";
}
}else{
echo "file is not exist!";
}
fclose($fp);
*/
/*************第二种读取方式********
$con = file_get_contents($file_path);
$con1 = str_replace("\n", "</br>", $con);
echo $con1;
*/
/*************第三种读取方式******/
if(file_exists($file_path)){
if($fp = fopen($file_path,"r+")){
$buffer= 1024;
//一边读,一边判断是都到文件的末尾
while(!feof($fp)){
$con = fread($fp, $buffer);
echo "文件的内容是1111:</br>";
//注意:在默认情况下,我们得到的内容输出到网页后,是没有换行的
//不认\r\n 需要进行下面的替换
$con1 = str_replace("\n", "</br>", $con);
echo $con1;
}
}else{
echo "file open error!";
}
}else{
echo "file is not exist!";
}
fclose($fp);
//文件内容
$arr = parse_ini_file($file_path);
echo "<pre>";
print_r($arr);
echo "</pre>";
~~~
⦁写文件
~~~
<?php
//如何写文件
$file_path = "/var/myphp/file/file.txt";
/*******传统的方法**********
if(file_exists($file_path)){
//如果是追加内容,使用a+
//如果是全新的写到文件,则使用w+,清空原文件再写入
if($fp = fopen($file_path,"a+")){
$buf="asd123123\n";
fwrite($fp, $buf);
}else{
echo "file open error!";
}
}else{
echo "file is not exist!";
}
fclose($fp);
*/
/*********另外方法********/
$con = "woaini\n";
//默认情况,即不加第三个参数,则是w+方式
file_put_contents($file_path, $con,FILE_APPEND);
echo "write Ok!";
//注意,此函数在底层调用fopen fwrite,调用这个函数一般不使用循环写
~~~
⦁拷贝一个文件
###
~~~
<?php
//拷贝一个文件
//copy函数
/*******注意*******
* 默认情况下路径是不能带汉字的,如果使用汉字
* 需要只用iconv("utf-8","gb2312","date");转换下
*/
$file_path="file.txt";
$new_file="1.txt";
if(!copy($file_path, $new_file)){
echo "copy error!";
}else{
echo "copy OK!";
}
~~~
⦁文件下载
http://blog.csdn.net/sjin_1314/article/details/8981745
⦁文件创建,删除,文件的创建,删除
~~~
<?php
//文件及文件夹的创建和删除
/******创建文件夹******
$dir_name="/var/jsh1";
if(!is_dir($dir_name)){
if(mkdir($dir_name)){
echo "创建文件成功!</br>";
}else{
echo "创建失败!</br>";
}
}else{
echo "文件夹存在!</br>";
}
*/
/*****创建多级目录***/
$dir_name="/var/jsh1/aaa/bbb/ccc";
if(!is_dir($dir_name)){
if(mkdir($dir_name,0777,true)){
echo "创建文件成功!</br>";
}else{
echo "创建失败!</br>";
}
}else{
echo "文件夹存在!</br>";
}
/*****删除文件夹****/
//如果文件夹下有文件,或者目录,均不能删除
if(rmdir("/var/jsh1/aaa/bbb/ccc")){
echo "删除文件夹Ok!</br>";
}
/*******创建文件*****/
$file_name="/var/jsh1/1.txt";
if($fp = fopen($file_name,"w+")){
$buf="asd123123\n";
fwrite($fp, $buf);
}else{
echo "file open error!";
}
/*******删除文件****/
//2个方法 delete 和unlink
if(is_file($file_name)){
if(unlink($file_name)){
echo "删除成功!</br>";
}
}else{
echo "文件不存在!</br>";
}
~~~
文件上传
如果要上传文件,需要把
~~~
<formenctype=*"multipart/form-data"*action=*"upLoad.php"*name=*"myform"*method=*"post"*>
~~~
Enctype post 必须填写成上面内容:下面界面如下:
![](https://box.kancloud.cn/2016-06-03_5750fd9116964.jpg)
采用前面讲解的Mvc模式,代码如下:
### 界面(V):
~~~
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>文件上传</title>
</head>
<body>
<form enctype="multipart/form-data" action="upProcess.php" name="myform" method="post">
<table>
<tr><td align="center" colspan="2" ><font style="font-size: 40px;
font-family:华文彩云">文件上传</font></td></tr>
<tr><td>请填写用户名:</td><td><input type="text" name="username" ></td></tr>
<tr><td>请简单介绍该文件:</td><td><textarea name="fileinfo" rows="10" cols="80"></textarea></td></tr>
<tr><td>请选择要上传的文件:</td><td><input type="file" name="myfile"></td></tr>
<tr><td><input type="submit" value="上传文件"></td><td></td></tr>
</table>
</form>
</body>
</html>
~~~
### 控制器(c)
~~~
<?php
//获得提交文件的用户
$username=$_POST['username'];
$fileinfo=$_POST['fileinfo'];
//我们这边需要使用到$FILES超全局数组,获得上传文件属性,打印如下
echo "<pre>";
print_r($_POST);
print_r($_FILES);
echo "</pre>";
//获取文件的大小
$file_size=$_FILES['myfile']['size'];
if($file_size > 2*1024*1024){
echo "文件过大!,不能上传大于2M的文件</br>";
exit(1);
}
//获取文件的类型
$file_type = $_FILES['myfile']['type'];
if($file_type!='image/jpg' && $file_type!='image/jpeg' ){
echo "文件类型只能是jpg的!</br>";
exit(1);
}
//判断是否上传成功
if(is_uploaded_file($_FILES['myfile']['tmp_name'])){
//把文件转存到指定的目录
/*注意:
* 上传文件的大小,在php.ini文件中有说明,默认最大2M,可以自己设置
*
* */
//我们给每个用户动态的创建一个文件夹
$user_path = "/var/myphp/file/".$username;
//判断该用户是否存在文件夹
if(!file_exists($user_path)){
if(mkdir($user_path)){
echo "创建成功!</br>";
}
}
//$file_path=$user_path.$_FILES['myfile']['name'];
$file_name=$_FILES['myfile']['name'];
$file_path=$user_path."/".time().rand(1,1000).substr($file_name, strrpos($file_name, '.'));
if(move_uploaded_file($_FILES['myfile']['tmp_name'], $file_path)){
echo "上传成功!</br>";
}else{
echo "上传失败2!</br>";
}
}else{
echo "上传失败1!</br>";
}
?>
~~~
### 上传文件细节
1.如果控制用户上传文件的大小<2M
2.如果控制用户上传的文件类型
3.如果防止用户图片覆盖问题
解决方法:
给每个用户创建一个文件夹(或者按照日期),将个人的文件保存的自己的文件夹里面
4.如果防止同一用户文件名相同的问题
格式:路径.时间戳.文件后缀
~~~
$file_path=$user_path."/".time().rand(1,1000).substr($file_name,strrpos($file_name,'.'));
~~~
###参考资料:
[ PHP文件上传后缀名与文件类型对照表](http://www.jb51.net/article/23511.htm)
文件编程到此结束,有深入的问题欢迎在下面指出!
- 前言
- HTML(第一天)
- HTML(第二天)
- DIV+CSS(第一天)
- DIV+CSS(第二天)
- DIV+CSS(第三天)
- DIV+CSS(第四天)
- PHP开发环境配置说明
- PHP基础数据类型及运算符介绍
- 走进PHP函数
- 走进位运算
- 走进数组及相关数组函数
- 面向对象的编程(类与对象)
- 面向对象的编程(类成员方法用法)
- 构造方法,析构方法
- static,global用法
- 静态方法
- 面向对象的编程方法
- 接口方法
- 接口VS继承、final、const
- 错误及异常处理机制、错误日志
- HTTP协议深度剖析
- 文件下载
- PHP数据库编程
- 数据库编程(2)
- 超全局变量
- Zend studio 开发环境入门
- 雇员管理系统(1)
- 雇员管理系统(2)
- 会话技术(cookie session)
- 会话技术 session场景使用介绍!
- PHP.in中session和cookie的配置说明
- PHP文件编程
- 报表及绘图技术
- 报表及绘图技术(jpgraph库使用,Linux安装及配置说明)
- XML基本语法及DTD介绍
- XML编程(Dom技术)
- XML编程(Xpath技术,simpleXml技术)基础入门
- 网上支付平台PHP版本
- javascript基础入门