文件上传下载

1.php.ini配置文件

如果要在PHP中实现小文件的上传(2MB以下),那么无需对php.ini配置文件进行修改,使用默认参数即可。但如果想实现完美的上传功能,则一定要对配置文件有所了解。首先来看一下图。

 

从图中可以看到,有3部分内容需要进行配置。首先来看第1部分。

1.Resource Limits

Resource Limits,直译过来就是资源限制,包含了3个参数。该区块不仅仅是针对上传下载的,而是对全部的文件进行设置。各个参数含义及参数值说明如表1所示。

表1                   Resource Limits块的参数说明

参    数

说    明

max_execution_time

每个脚本页面完成执行操作的最大时间,单位是秒。如果设为−1,说明没有限制

max_input_time

每个脚本页面处理请求数据的最大时间,单位是秒,也可以设为−1

memory_limit

一个脚本页所能够消耗的最大内存

2.post_max_size

post_max_size参数指PHP通过表单POST所能接收的最大值,包括表单里的所有项。

3.File Uploads

File Uploads块是专为文件上传设置的。该区块中同样包含了3个参数。参数含义及参数值说明如表2所示。

表2                    File Uploads块的参数说明

参    数

说    明

file_uploads

是否允许HTTP上传,默认为On,即为开启,无需修改

upload_tmp_dir

文件上传时的临时存储目录。如果没指定就会用系统默认的临时文件夹

upload_max_filesize

允许上传的文件的最大值

2.文件上传表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <form action="test.php" method="post" enctype="multipart/form-data">
         单个文件上传<br/>
        <input type="file" name="filename"/>
        <input type="submit" value="enter"><br/>
         多个文件上传<br/>
        <input type="file" name="userfile[]"/>
        <input type="file" name="userfile[]"/>
        <input type="submit" value="上传"/>
        <!-- 给一个隐藏域限制上传文件的大小 -->
        <input type="hidden" name="max_file_size" value="1024000">
    </form>
</body>
</html>

3.文件上传数据处理

如果表单设计的没有问题,那么在处理页中,使用$_FILES预定义变量就可以得到上传文件的相关信息。反之,如果得不到,那么就有可能是配置文件或表单设置的问题了。稍后会介绍上传的常见错误及原因。下面先介绍预定义变量$_FILES。

$_FILES变量存储的是上传文件的相关信息,这些信息对于上传功能有很大作用。该变量是一个二维数组,保存的信息如表3所示。

表3                         $_FILES变量值

元  素  名

说    明

$_FILES[filename]['name']

存储了上传文件的文件名。例如:exam.txt、myDream.jpg等

$_FILES[filename]['size']

存储了文件大小。单位为字节

$_FILES[filename]['tmp_name']

文件上传时,首先在临时目录中被保存成一个临时文件。该变量为临时文件名

$_FILES[filename]['type']

上传文件的类型。注意是类型,不是后缀

$_FILES[filename]['error']

存储了上传文件的错误代码

error字段将返回上传文件的错误码,一共有7种状态。状态代码及说明如表4所示。

表4           $_FILES[filename]['eror']中的错误代码及说明

错 误 代 码

错 误 说 明

0

UPLOAD_ERR_OK。上传成功,无错误

1

UPLOAD_ERR_INI_SIZE。上传文件大小超出php.ini中的upload_max_filesize的参数值

2

UPLOAD_ERR_FORM_SIZE。上传文件大小超出表单中MAX_FILE_SIZE隐藏域的值

3

UPLOAD_ERR_PARTIAL。文件没有被全部上传

4

UPLOAD_ERR_NO_FILE。没有文件被上传

6

UPLOAD_ERR_NO_TMP_DIR。找不到临时文件目录

7

UPLOAD_ERR_CANT_WRITE。文件写入失败

<?php 
header("Content-type: text/html; charset=utf-8");
// 文件上传
$tmparr=$_FILES['filename'];//获取上传文件信息
if($tmparr['name']!=''){
    foreach($tmparr as $name=>$value){//循环输出数组索引和值
        echo $name.'=>'.$value.'<br>';
    }
}else{
    echo "<script>alert('请添加上传文件')</script>";
}
//上传文件函数
if($tmparr['error']==0){//上传成功
    if(is_uploaded_file($tmparr['tmp_name'])){//判断是不是post上传文件
        if(true==move_uploaded_file($tmparr['tmp_name'], $tmparr['name'])){
            echo "上传成功";
        }else{
            echo "<script>alert('文件不合法');history_go(-1);</script>";
        }
    }else{
        echo "<script>alert('非法操作');history_go(-1);</script>";
    }
}else{//上传失败
    echo "<script>alert('上传错误,错误类型:".$tmparr['error']."');history_go(-1);</script>";    
}

打印$_FILES

 4.文件下载

1.通过链接下载

通过链接下载,就是将文件的相对路径或绝对路径直接作为超链接即可。如果是压缩文件,那么直接单击超链接就可以下载;对于文本文件,单击鼠标右键,选择“目标另存为”命令,就可以将文本文件下载下来。所有格式的文件,都可以通过这种方法下载下来。下面是一个实例,代码如下:

要下载聊天室模块源码,请点击<ahref= "../14.rar">这里</a>

2.通过header()函数下载

header()函数属于HTTP函数,它的作用是发送一个原始的HTTP标头。header()函数的语法格式如下:

void header ( string string [, bool replace [, int http_response_code]] ) 

参数说明如下:

string:发送的标头。

replace:如果一次发送多个标头,指明相似的标头是替换还是添加。如果是False,则强制发送多个同类型标头。默认是True,即替换。

http_response_code:强制HTTP响应为指定值。

HTTP标头有很多,这里只介绍下载,其他请参考相关资料。下载HTTP标头的代码如下:

header('Content-Disposition: attachment; filename="filename"');

上面的代码中惟一需要改动的就是filename。将filename替换为要下载的文件就可以了。

在下面的实例中,如果用户单击“同意”按钮,将会调用down()函数并跳转到test.php页中,如果用户单击“不同意”按钮,页面将关闭。代码如下:

 <div style="padding: 15px; 300px;height: 50px;border: 1px #000000 solid;">
        协议条款<br/>
        ...<br/>
        ... ...<br/>
        <button onclick="down('./ff6.png')">同意</button> <button onclick="closeme()">不同意</button>
    </div>
    <div style="padding: 5px;">如果你想下载该文件,请详细阅读上面的服务条框。你同意后可以下载</div>
    <script>
        function down(name){
            location='test.php?act=true&name='+name;
        }
        function closeme(){
            window.opener=null;
            window.close();
        }
    </script>

 处理页代码

<?php
     if($_GET['act']  == true){
         header('Content-type: application/octet-stream');        //设置HTTP标头
         header('Content-Disposition: attachment; filename="'.$_GET['name'].'"');
      readfile('../'.$_GET['name']);                                          //读取文件
     }
?>
原文地址:https://www.cnblogs.com/aten/p/8743593.html