### 文件編程
?文件編程的必要性
?在網站開發中,我們要使用到文件的上傳和下載,就是經典的文件編程的使用
?文件的基本概念
文件就是保存數據(二進制素具,文本數據),在程序員看來,文件就是數據的來源。
?文件流
在對文件進行操作的過程中,我們以流的概念來操作
###

從該圖中我們可以看出,如果你的數據是從程序(內存)向文件(磁盤)流動,則我們成為輸出流,反之輸入流。
?文件-操作的方式
本地操作和遠程操作(通過網絡)
?常用的文件操作函數
?獲取文件信息函數
~~~
<?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 必須填寫成上面內容:下面界面如下:

采用前面講解的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基礎入門