PHP中的文件上传下载

一、文件上传

1、客户端

<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
上传形象:<input name="myfile" type="file" />
<input type="submit" value="上传"/>
</form>
<!-- enctype=multipart/form-data 用来指定表单编码数据方式,让服务器知道,要传递一个文件,并带有常规的表单信息 -->

MAX_FILE_SIZE 隐藏字段(单位为字节 B必须放在文件输入字段之前,其值为接收文件的最大尺寸。

【1G=1024M,1M=1024K,1K=1024B】

这是对浏览器的一个建议,PHP 也会检查此项。在浏览器端可以简单绕过此设置,因此不要指望用此特性来阻挡大文件。

实际上,PHP 设置中的上传文件最大值是不会失效的。但是最好还是在表单中加上此项目,因为它可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦

2、PHP配置(php.ini)

配置项 说明 默认
file_uploads 是否接受HTTP文件上传 ON开启
upload_tmp_dir 上传文件的临时保存目录(可写的权限) null
upload_max_filesize 控制允许上传的文件最大大小,大于该值,PHP将创建一个文件为0的占位符文件 2M
post_max_size 所有POST数据的最大值 8M
memory_limit 设置脚本可以分配最大内存量 8M

3、文件上传

//var_dump($_FILES)
Array
(
    [myfile] => Array
        (
            [name] => 0122.jpg
            [type] => image/jpeg
            [tmp_name] => /tmp/phpU3QInT
            [error] => 0
            [size] => 154791
        )

)

tmp_name

存储在服务器的文件的临时名称

name

用户上传时的文件名称

size

文件的字节大小(B)

type

就是文件的MIME类型(主类型/子类型)

error

与文件上传相关的错误代码

  • 0 无错误,上传成功
  • 1 上传的文件超过了php.ini中 upload_max_filesize 选项限制的值
  • 2 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值
  • 3 表示文件只被部分上传
  • 4 表示文件没有上传任何文件
//代码参考
if($_FILES['file']['error'] > 0){
    switch ($_FILES['file']['error']) {    //错误码不为0,即文件上传过程中出现了错误
        case '1':
            echo '文件过大,超过php.ini限制';
            break;
        case '2':
            echo '文件过大,超过表单中 MAX_FILE_SIZE限制';
            break;
        case '3':
            echo '只有部分文件被上传';
            break;
        case '4':
            echo '文件没有被上传';
            break;
        case '6':
            echo '找不到指定文件夹';
            break;
        case '7':
            echo '文件写入失败';
            break;
        default:
            echo "上传出错<br/>";
    }
}else{
    //错误码为0,即上传成功,可以进行后续处理,处理流程见下文
}

MIME类型

在把输出结果传送到浏览器上的时候,浏览器必须启动相应的应用程序来处理这个输出文档。这可以通过多种类型MIME(多功能网际邮件扩充协议)来完成。在HTTP中,MIME类型被定义在Content-Type header

文件 后缀名 mime类型
网页文件 .html,.html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
PNG图形 .png image/png
JPEG图形 .ipeg,.jpg image/jpeg
MPEG文件 .mpg,.mpeg video/mpeg

转移文件

临时文件,当前运行结束的时候,临时文件也会伴随着销毁,所以我们要转移文件.

bool move_upload_file(合法的上传文件, 保存的文件名)

将上传的文件转移到新的位置。此函数可以确保由一个参数指定的文件,是否是合法的上传文件。

4、多文件上传

<form action="" method="post" enctype="multipart/form-data">
    上传图片:<input type="file" name="myfile[]" />
    上传图片2:<input type="file" name="myfile[]" />
    上传图片3:<input type="file" name="myfile[]" />
    <input type="submit" value="提交"/>
</form>

二、文件下载

1、浏览器不能直接打开

对于浏览器无法直接打开的文件,我们一般只需要设置一下超链接就好了。比如rar,zip.

<ul>
  <li> <a href="down.zip" >下载美女图片</a> </li>
  <li> Item two </li>
</ul>

2、浏览器能直接打开

下载列表list.php

<ul>
  <li> <a href="down.php" >下载美女图片</a> </li>
  <li> Item two </li>
</ul>

负责下载的页面down.php

$filename = 'image/测试.jpg';
$filename = 'meinv.jpg';
if( !file_exists($filename) ) 
    exit('文件不存在');
$file_size = filesize($filename);

//header('Content-Type:image/png');
# 返回内容的类型是二进制流
header('Content-Type:application/octet-stream');
# 下载文件以字节计算
header('Accept-Ranges:bytes');
# 被下载文件的大小
header('Accept-length:'.$file_size);
# 可以让浏览器弹出下载窗口,以附件的形式打开文件
header('Content-Disposition:attachment;filename='.$filename);
# 读取文件
readfile($filename);