thinkPHP下载后包含的目录如下:
thinkPHP目录结构其中project 应用部署目录为应用的根目录,(可设置)项目的名称可以自己修改,但是修改后需要在系统配置的参数中做对应的修改,位置是thinkphp\convention.php这个文件,这里不做详细说明,如果想了解,请继续关注我之后的文章。
public WEB部署目录(对外访问目录),public目录下的index.php应用入口文件是网站唯一的入口,所有内容的访问都是通过这个文件来实现的。实际调用的程序文件在application下,访问网站时如果不带任何路径,默认就是访问到 application下的index模块。
在使用thinkPHP框架的时候,大多不需要更改其他文件夹下的内容,主要编写的内容都在application下,可以在此文件夹下增加新的模块,并在controller 下增加控制类,在view下增加输出的模板。
php 获取 post 数据
如果要得到网页中post过来的数据,我们通常会用到以下三种方式。
$_POST;
可以看成是把$HTTP_RAW_POST_DATA过滤和格式化后的数据。识别的数据类型是PHP默认识别的数据类型 application/x-www.form-urlencoded
注意事项:
无法解析如text/xml,application/json等非 application/x-www.form-urlencoded 数据类型的内容经验证不能用于enctype="text/plain" 经验证可用于enctype="multipart/form-data"
HTTP_RAW_POST_DATA;
官方文档解释:原生POST数据。需要通过php.ini开启,开启后可通过全局变量 $GLOBALS['HTTP_RAW_POST_DATA'] 获取到post数据。
注意事项:
需要设置 php.ini 中的 always_populate_raw_post_data 值为 On 才会生效不能用于 enctype="multipart/form-data"PHP7中已经移除了这个全局变量,用 php://input 替代相比php://input 需要更多的内存
php://input
php://input 访问各个输入/输出流。允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。POST 请求的情况下,最好使用 来代替 ,因为它不依赖于特定的 指令。 而且,这样的情况下 默认没有填充, 比激活always_populate_raw_post_data 潜在需要更少的内存。 enctype="multipart/form-data"的时候 是无效的
注意事项:
不需要任何特殊的 php.ini 设置不能用于 enctype="multipart/form-data"数据获取方式 :$data = file_get_contents("php://input");
引言
想逐行读取文件,完全避免把这个文件加载到内存中。如果文件太大(比如 18G),无法在内存中打开,还是要硬来的话,会抛出异常。
大小的编程语言都提供了文件的按行读写,PHP 怎会没有!
正确方法
是不能够使用 file_get_contents 函数,一股脑把所有文件内容扔到内存的。应该使用 fgets 函数逐行读取:
$handle = fopen("inputfile.txt", "r"); if ($handle) {while (($line = fgets($handle)) !== false) { // process the line read. } fclose($handle); } else { // error opening the file. }
首先打开文件句柄,然后逐行使用 fgets 读取,处理完毕后使用 fclose 显式关闭。
当然,你也可以不必使用 false 判断,转而使用 feof 检测是否到文件末尾即可:
if ($file = fopen("file.txt", "r")) {while(!feof($file)) { $line = fgets($file); # do same stuff with the $line }fclose($file);}
所谓“条条大道通罗马”,实现功能的方法不止一种。我们更推荐的是下面的这种写法。使用 PHP 5.1 之后提供的 SplFileObject 对象处理文件。
那么就可以这样写:
$file = new SplFileObject("file.txt");// Loop until we reach the end of the file. while (!$file->eof()) { // Echo one line from the file. echo $file->fgets(); } // Unset the file to call __destruct(), closing the file handle. $file = null;
这个对象提供了为数众多的方法用于文件操作:
比起我们常用的一些文件操作函数:
fgetss() - 从文件指针中读取一行并过滤掉 HTML 标记fread() - 读取文件(可安全用于二进制文件)fgetc() - 从文件指针中读取字符stream_get_line() - 从资源流里读取一行直到给定的定界符fopen() - 打开文件或者 URLpopen() - 打开进程文件指针fsockopen() - 打开一个网络连接或者一个Unix套接字连接stream_set_timeout() - Set timeout period on a streamSplFileObject 对象封装的更为灵活,如果嵌入到程序内使用,可以组装为十分强大的文件操作类。比一个个的操作函数,有更强的可扩展性。
写在最后
通过一个大文件的按行读取,我们引出了 SplFileObject 这个文件操作对象,希望大家仔细地学习一下,可以大大提升功力。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
1、首先,我们需要先下载一份PHP类—getid3 https://codeload.github.com/JamesHeinrich/getID3/zip/master
2、解压刚才下载好的文件,拿出两个文件夹 getid3 及 helperapps
3、加载音频类文件 require_once('getid3/getid3.php');
4、获取你数据库中的文件的URL 如 : $url = "../uploadfile/file/20180608/20180608061015_74942.m4a"
5、$arr = explode("/", $url); 用"/"拆开这个字符串
5、$file_url = realpath(dirname(__FILE__).'/../../').DIRECTORY_SEPARATOR.$arr[1].DIRECTORY_SEPARATOR.$arr[2].DIRECTORY_SEPARATOR.$arr[3].DIRECTORY_SEPARATOR.$arr[4] ;
拿到文件的真实地址,这里只能用绝对路径 ,DIRECTORY_SEPARATOR是自动判断"/还是\".
这里可以打印下结果 D:\phpStudy2\WWW\uploadfile\file\20180608\20180608061317_79304.m4a
6、拿到了文件的真实路径后
$getID3 = new getID3(); //实例化类
$ThisFileInfo = $getID3->analyze($file_url); //分析文件,$file_url为音频文件的地址
$fileduration=$ThisFileInfo['playtime_seconds'];//这里拿的是音频时长,你可以拿其他参数
好了,是不是非常简单的就实现了呢,有任何问题可以给我留言哦!
涉及相关知识点:
①PHPExcel是用来操作Office Excel 文档的一个PHP类库,它基于微软的Openxml标准和PHP语言。可以使用它来读取、写入不同格式的电子表格。
②time() 返回当前时间的秒数的函数,用来获取当前的系统时间
③require_once 为了避免重复加载文件即加载文件一次
④array()创建数组
⑤memory_get_usage()php内置函数能返回当前分配给PHP脚本的内存量,使用它来调试PHP代码性能
⑥var_dump() 用来打印数组,或者输出字符串
php读取excel文件,并进行相应处理的具体方法
代码示例如下:
<?php
/*读取excel文件,并进行相应处理*/
$fileName = "url.xls";
if (!file_exists($fileName)) {
exit("文件".$fileName."不存在");
}
$startTime = time(); //返回当前时间的Unix 时间戳
require_once './PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFactory::load($fileName);
//获取sheet表格数目
$sheetCount = $objPHPExcel->getSheetCount();
//默认选中sheet0表
$sheetSelected = 0;$objPHPExcel->setActiveSheetIndex($sheetSelected);
//获取表格行数
$rowCount = $objPHPExcel->getActiveSheet()->getHighestRow();
//获取表格列数
$columnCount = $objPHPExcel->getActiveSheet()->getHighestColumn();
echo "<div>Sheet Count : ".$sheetCount." 行数: ".$rowCount." 列数:".$columnCount."</div>";
$dataArr = array();
/* 循环读取每个单元格的数据 */
//行数循环
for ($row = 1; $row <= $rowCount; $row++){
//列数循环 , 列数是以A列开始
for ($column = 'A'; $column <= $columnCount; $column++) {
$dataArr[] = $objPHPExcel->getActiveSheet()->getCell($column.$row)->getValue();
echo $column.$row.":".$objPHPExcel->getActiveSheet()->getCell($column.$row)->getValue()."<br />";
}
echo "<br/>消耗的内存为:".(memory_get_peak_usage(true) / 1024 / 1024)."M";
$endTime = time();
echo "<div>解析完后,当前的时间为:".date("Y-m-d H:i:s")."
总共消耗的时间为:".(($endTime - $startTime))."秒</div>";
var_dump($dataArr);
$dataArr = NULL;}
第一节 上传设置
客户端设置
form:method=post、enctype="multipart/form-data"
input:type=file
<form action="upload.php" method="post" enctype = "multipart/form-data"><input type="file" name="fname"> <!--MAX_FILE_SIZE有兼容问题--> <input type="hidden" name="MAX_FILE_SIZE" value="30000" /> <button type="submit">提交</button></form>
服务端设置
在php.ini中进行设置:
默认uploadmaxfilesize = 2M,如果你想上传超过8M的文件,比如:20M,你在设定uploadmaxfilesize = 20M的同时,还要修改postmaxsize选项(默认为8M)。否则post数据超出限制,$_FILES将会为空(报错)。
$_FILES数组
$_FILES超全局数组中,包含着从客户端提交文件的全部信息:
array (size=1)'fname' => //上传文件表单项的name array (size=5) 'name' => string 'home.html' (length=21) //上传文件的名称 'type' => string 'text/html' (length=9) //文件类型(常见文件都可以上传) 'tmp_name' => string 'C:\wamp\tmp\php57A2.tmp' (length=23) //上传文件的临时文件名 'error' => int 0 //上传文件遇到的错误号 'size' => int 28131 //上传文件的大小
上传步骤
var_dump($_FILES);$file=$_FILES["fname"];
获取$_FILES文件 临时文件
$tmp_file=$file["tmp_name"];
获取后缀名
$ext=pathinfo($file["name"],PATHINFO_EXTENSION);//后缀名
创建新文件名
$new_file="file".rand(1,1000000).".".$ext;
保存路径
$path="./files";
格式化路径
$path=rtrim($path,'/')."/";
拼接上传目录
$new_file=$path.$new_file;
临时文件转换成正式文件
move_uploaded_file($tmp_file,$new_file);
PHP第二节 下载设置
浏览器对于可识别的文件格式(html、txt、png、jpg等),默认是直接打开的,对于无法识别的文件,才作为附件来下载。为了可以让可识别的文件也直接可以下载,需要进行如下设置:
<a title="点击下载" href="down.php?name=01.jpg&type=image/jpeg"><img src="01.jpg"></a>
1. 读取文件
$fliename=$_GET["name"];$filetype=$_GET["type"];
2. 文件的描述信息 Content-Disposition(内容配置)指定为attachment(附件)(必须)
header("Content-Disposition:attachment;filename={$filename}");
3. 指定被下载文件的类型(非必须)
header("Content-Type:{$filetype}");
4. 指定被下载文件大小(非必须)
header("Content-Length:".filesize($filename));
5. 将内容读入内存缓冲区
readfile($filename);
注意:在 readfile($filename) 之前,不能有任何输出语句(错误信息、var_dump调试语句,echo输出等),否则下载的文件会出错。
PHP-文件处理系统「程序员培养之路第三十七天」
PHP-错误日志处理「程序员培养之路第三十六天」
PHP-日期时间操作函数「程序员培养之路第三十五天」
一、打开关闭文件
1、fopen()函数打开文件,它有两个参数第一个是文件名,第二个是打开方式。
// 获取文件路径 $filePath = "psg.txt"; // 打开文件,将资源绑定到一个流或者句柄,绑定之后,脚本就可以通过句柄与此资源交互。 $fileHandle = fopen($filePath, "a+");
fopen()函数第二个参数可能的值
mode
说明
r只读方式打开,文件从头开始读。
r+读写方式打开,文件从头开始读写。
w只写方式打开文件,从文件开头开始写。如果文件已经存在,将文件指针指向文件头并将文件大小截为零,即删除所有文件已有的内容,如果文件不存在,函数将创建这个文件。
w+读写方式打开文件,如果文件已经存在,将文件指针指向文件头并将文件大小截为零。即删除所有文件已有的内容,如果文件不存在,函数将创建这个文件。
a写入方式打开,将文件指针指向文件末尾。如果该文件已有内容,将从文件末尾开始追加,如果该文件不存在,函数将创建这个文件。
a+读写方式打开,将文件指针指向文件末尾。如果该文件已有内容,将从文件末尾开始追加或者读,如果该文件不存在,函数将创建这个文件。
作者:XZ阳光小熊链接:https://www.jianshu.com/p/e845ab9e85c6來源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
知识点:
涉及函数:
//打开文件fopen(string $filename,string $mode); //给文件写入内容fwrite($fp, $a); //关闭资源fclose($fp);//从文件指针中读入一行并解析 CSV 字段fgetcsv(resource $handle);本文只讲解案例和抽选相关函数讲解,更多知识点移步:菜鸟教程
如上图案例结构图,按照阁主流程和思路将讲解如何创建msg.txt文本文档,并使用PHP对文档进行写入和读取操作,最后输出可视化展现给用户。
1.创建并打开msg.txt文档
文档存放与根目录下的files文件夹下。
//a参数为写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 $fp= fopen('./files/msg.txt','a');网而打开write.php会发现files文件夹下多出msg.txt空白内容的文档。
2.前端提交留言:
这里写了一个简单的前台提交表单页面。下列代码会将表单信息以POST提交方式提交往write.php进行后续写入处理。
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>添加留言</title></head><body><form action="write.php" method="post"> 标题: <input type="text" name="title" id=""><br /> 内容: <textarea name="content" id="" cols="30" rows="10"></textarea><br /> <input type="submit" value="提交"></form></body></html>效果:
3.将前台提交留言写入msg.txt。
//拼接写入内容$a=$_POST['title'].','.$_POST['content']."\n";//打开文件$fp= fopen('./files/msg.txt','a');//沿着资源写入内容fwrite($fp, $a);//关闭资源fclose($fp);//友好提示echo 'Is OK';效果:这里只查看文档内容情况。
4.读取文档内容。
使用while循环输出文档内容。fgetcsv函数依据文档内的逗号来隔开字符并以数组形式存放。
$fp = fopen('./files/msg.txt', 'r');echo '<table border="1">';//fgetcsv函数指针识别到最后没内容会返回false.while (($row = fgetcsv($fp)) != false) { echo '<tr>'; echo '<td>' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; echo '</tr>';}echo '</table>';fclose($fp);效果:
5.id传参教学。
其实教程到第4步应该结束了,但是想一想最后展示的留言内容太多,不利于用户自己查看,随后补了一个id传参知识点。使用id传参可以准确的让PHP帮我们处理并输出单条留言信息。
在第四步的基础上改写一下,也就是加入了<a>标签进行传参进行跳转相应留言字段。
$fp = fopen('./files/msg.txt', 'r');echo '<table border="1">';$tid = 1;while (($row = fgetcsv($fp)) != false) { echo '<tr>'; echo '<td><a href="'.'read2.php?tid='.$tid.'">' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; echo '</tr>'; $tid = $tid + 1;}echo '</table>';接下来新建read2.php文件,键入下列代码,用于接收read.php发过来的参数并处理展现单条留言给用户。
$fp = fopen('./files/msg.txt', 'r');$tid = $_GET['tid'];$num = 1;while (($row = fgetcsv($fp)) != false) { if ($num == $tid){ echo '<h1>'.$row[0].'</h1>'; echo '<p>'.$row[1].'</p>'; } $num = $num+1;}fclose($fp);效果:
结束:
最终效果演示:
项目源码:
蓝奏云提供下载:
file_demo1.zip大小:2.2 K
已经过安全软件检测无毒,请您放心下载。
1.文件的路径问题
我们之前也用过一些有关文件路径问题的知识,比如:
<a href=”网页路径” > ....</a>
<img src=”图片路径” />
<script src=”js文件路径” ></script>
php中,有3种路径
相对路径:
有两个特定符号(特定路径)来决定的路径形式:
./ :表示当前目录,也就是当前网页所在的路径
../ :表示当前目录的上一级目录,也就是当前网页所在的目录的上一级目录
相对路径都是由这两个符号开头的路径形式,举例:
include ‘./page1.php’;
include ‘../page2.html’; //也可以载入html文件
include ‘./dir1/dir2/page3.html’;
include ‘../../dir4/dir5/page4.php’;
绝对路径:
就是指:通过该路径,可以不依赖逻辑,而是直接就找到对应文件。
有两种形式的绝对路径:
本地绝对路径:
include ‘c:/dir1/dir2/page1.html’;
include ‘f:/dir3/page3.php’;
特别注意:在代码中,其实千万不要出现上述这种“字面上的绝对本地路径”!!!
实际上,我们需要在代码来“获取”绝对路径,以实现本地文件的绝对路径的加载。
通常,需要使用(以来)如下2个常量,来获取相应的信息:
__DIR__:获取当前网页文件所在的本地绝对路径(目录);
DIRECTORY_SEPARATOR: 它是一个系统常量,表示当前操作系统红的目录之间的分隔符,有:
window系统中,分隔符为:\
linux或unix系统中,分隔符为:/
举例如下:
无指定路径:
形式类似这样:
include ‘page1.html’; //没有给出任何路径信息
include ‘page2.php’;
我们不推荐这样用。
如果万一这样用了,通常php是会在当前网页文件所在位置来找该文件。
2.文件载入详细过程
假设前提:主文件中,有一个载入语句,比如:
include ‘./page1.php’;
则其过程如下:
1,在该语句之前,先“中断”php的代码区域,进入html代码区域;
2,然后,在该语句处,相当于使用被载入的文件内容,替换该载入语句本身!
3,最后,又退出html区域,重新进入php代码区域,继续后续代码。
举例:
它相当于:
为了查看文件夹下有哪些目录, 我们就需要在指定目录下读取所有文件名
$dir = ROOT_PATH . "/up/download/"; //文件目录
if (is_dir($dir)){
if ($dh = opendir($dir)){//打开目录句柄
while (($file = readdir($dh)) !== false){//读取它的内容
echo "filename:" . $file . "<br>";
}
closedir($dh);
}
}