学习PHP——文件的上传下载

一、PHP文件处理

1.打开文件 fopen()

此函数的第一个参数含有要打开的文件的名称,第二个参数规定了使用哪种模式来打开文件。

模式描述
r只读。在文件的开头开始。
r+读/写。在文件的开头开始。
w只写。打开并清空文件的内容;如果文件不存在,则创建新文件。
w+读/写。打开并清空文件的内容;如果文件不存在,则创建新文件。
a追加。打开并向文件末尾进行写操作,如果文件不存在,则创建新文件。
a+读/追加。通过向文件末尾写内容,来保持文件内容。
x只写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。
x+读/写。创建新文件。如果文件已存在,则返回 FALSE 和一个错误。

如果 fopen() 函数无法打开指定文件,则返回 0 (false)。
如果 fopen() 函数不能打开指定的文件,可以用exit()生成一段消息提示。

<html>
<body>

<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>

</body>
</html>
2.关闭文件 fclose()
<?php
$file = fopen("test.txt","r");

//执行一些代码

fclose($file);
?>
3.检测文件末尾(EOF)

feof() 函数检测是否已到达文件末尾(EOF)。

在循环遍历未知长度的数据时,feof() 函数很有用。
在 w 、a 和 x 模式下,无法读取打开的文件!

if (feof($file)) echo "文件结尾";
4.逐行读取文件 fgets()

逐行读取文件,直到文件末尾为止。
在调用该函数之后,文件指针会移动到下一行。

<?php
$file = fopen("welcome.txt", "r") or exit("无法打开文件!");
// 读取文件每一行,直到文件结尾
while(!feof($file))
{
    echo fgets($file). "<br>";
}
fclose($file);
?>
5.文件编码

如果打开一个文件名为中文的文件,而系统编码和当前文档编码不一致,会导致文件找不到无法打开,解决方法是用 iconv() 函数编码转换成一致,如下:

$fpath=iconv('UTF-8','GB2312',"题库.csv");
$file=fopen($fpath,"r") or exit("无法打开文件!");
while(!feof($file))
{
    echo fgets($file). "<br>";
}
$arr=fgetcsv($file);//这个函数就是读取CSV文件的函数,他把文本读入后转为数组存储在$arr中
fclose($file); 
foreach($arr as $key=>$value){echo $value;}//循环输出所有的值

.CSV文件是逗号分隔符。
用相对路径打不开子目录中的文件时,可用绝对路径打开,如下:

$file=fopen(dirname(__FILE__).'\\……(文件夹名)\\1.csv',"r") or exit("无法打开文件!");   

二、PHP文件上传

1.文件上传表单
<form action="upload_file.php" method="post" enctype="multipart/form-data">
    <label for="file">文件名:</label>
    <input type="file" name="file" id="file"><br>
    <input type="submit" name="submit" value="提交">
</form>

<form> 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。
<input>标签的 type="file"属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

2.文件上传脚本

通过使用 PHP 的全局数组 $_FILES,可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 “name”、“type”、“size”、“tmp_name” 或 “error”。

<?php
if ($_FILES["file"]["error"] > 0)
{
    echo "错误:" . $_FILES["file"]["error"] . "<br>";
    //$_FILES["file"]["error"] - 由文件上传导致的错误代码
}
else
{
    echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
     //$_FILES["file"]["name"] - 上传文件的名称
     
    echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
    // $_FILES["file"]["type"] -上传文件的类型
    
    echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
    //$_FILES["file"]["size"] - 上传文件的大小,以字节计
    
    echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];
    //$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
}
?>
3.文件上传限制

例子:用户只能上传 .gif、.jpeg、.jpg、.png 文件,文件大小必须小于 200 kB:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))//或者的条件有五个
&& ($_FILES["file"]["size"] < 204800)    // 小于 200 kb
&& in_array($extension, $allowedExts))  //if的几个条件
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"];//临时副本
    }
}
else
{
    echo "非法的文件格式";
}
?>
4.保存被上传的文件

上面的实例在服务器的 PHP 临时文件夹中创建了一个被上传文件的临时副本。
这个临时的副本文件会在脚本结束时消失。要保存被上传的文件,我们需要把它拷贝到另外的位置:

<?php
// 允许上传的图片后缀
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp);     // 获取文件后缀名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800)   // 小于 200 kb
&& in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "错误:: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
        echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
        echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
        echo "文件临时存储的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
        
        // 判断当期目录下的 upload 目录是否存在该文件
        // 如果没有 upload 目录,你需要创建它,upload 目录权限为 777
        if (file_exists("upload/" . $_FILES["file"]["name"]))
        {
            echo $_FILES["file"]["name"] . " 文件已经存在。 ";
        }
        else
        {
            // 如果 upload 目录不存在该文件则将文件上传到 upload 目录下
            move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
            echo "文件存储在: " . "upload/" . $_FILES["file"]["name"];
        }
    }
}
else
{
    echo "非法的文件格式";
}
?>

上面的脚本检测了文件是否已存在,如果不存在,则把文件拷贝到名为 “upload” 的目录下。

三、文件下载

1.几个文件下载用到的方法:
<?php
 //获取文件参数
$filename = $_GET['filename'];
 
// 修改这一行设置你的文件下载目录
$download_path = "ficheros/";
 
//不能下载上一层目录的文件
if(eregi("\.\.", $filename)) die("抱歉,你不能下载该文件!");
$file = str_replace("..", "", $filename);
 
// 包含 .fffffffff 的文件不能下载
if(eregi("\.fffffffff.+", $filename)) die("抱歉,你不能下载该文件!");
 
// 创建文件下载路径
$file = "$download_path$file";
 
//判断文件是否存在
if(!file_exists($file)) die("抱歉,文件不存在!");
 
//文件类型,作为头部发送给浏览器
$type = filetype($file);
 
// 获取时间和日期
$today = date("F j, Y, g:i a");//格式自定义
$time = time();//当前浏览器时间
 
//发送文件头部

//告诉浏览器文件类型
header("Content-type: $type");

//告诉浏览器这是一个文件流格式的文件    
header( "Content-type: application/octet-stream" ); 

//请求范围的度量单位  
header( "Accept-Ranges: bytes" ); 

//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name的值。
header("Content-Disposition: attachment;filename=$filename");

//Content-Length是指定包含于请求或响应中数据的字节长度    
header("Accept-Length: ".filesize ($file.$filename ));  

//邮件编码——二进制
header("Content-Transfer-Encoding: binary");

//本地缓存       no-store 彻底得禁用缓冲
header('Pragma: no-cache');

//不过期
header('Expires: 0');

// 发送文件内容
set_time_limit(0); //长时间链接运行,不限制运行时间
readfile($file);//若成功,则返回从文件中读入的字节数。若失败,则返回 false。
?>

点击此处,查看set_time_limit()

2. 直接添加文件链接
<button>
    <a href = "http://localhost/down.zip">
    下载文件
</button>

3.传递参数查找并跳转到下载链接
<button>
    <a href = "http://localhost?f='down'">
    下载文件
</button>
<?php
$down = $_GET['f'];   //获取文件参数
$filename = $down.'.zip'; //获取文件名称
$dir ="down/";  //相对于网站根目录的下载目录路径
$down_host = $_SERVER['HTTP_HOST'].'/'; //当前域名

//判断如果文件存在,则跳转到下载路径
if(file_exists(__DIR__.'/'.$dir.$filename)){
    header('location:http://'.$down_host.$dir.$filename);
}else{
    header('HTTP/1.1 404 Not Found');
}

?>
4.head() 和 fread()函数把文件直接输出到浏览器(安全)
<?php  
$file_name = "down";
$file_name = "down.zip";     //下载文件名    
$file_dir = "./down/";        //下载文件存放目录    
//检查文件是否存在    
if (!file_exists( $file_dir . $file_name )) {    
    header('HTTP/1.1 404 NOT FOUND');  
} else {    
    //以只读和二进制模式打开文件   
    $file = fopen( $file_dir . $file_name, "rb" );

    header("Content-type: application/octet-stream" ); 
    header("Accept-Ranges: bytes" ); 
    header("Accept-Length: " . filesize ( $file_dir . $file_name ) );    
    header("Content-Disposition: attachment; filename=" . $file_name );    

    //读取文件内容并直接输出到浏览器    
    echo fread( $file, filesize ( $file_dir . $file_name ) );    
    fclose( $file );    
    exit();    
}    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值