简单使用php上传文件

2014年5月25日

我做过很多网站都需要用到上传图片的功能,先简单总结下最简单的使用方式

XHTML表单

<form action="file_upload.php" method="post" enctype="multipart/form-data">
    选择图片: <input type="file" name="photo"/>
        <input type="submit" value="提交" />
</form>

这里特别注意需要上传图片需要把form表单的enctype属性设置为”multipart/form-data”,平常post请求默认的enctype属性是”application/x-www-form-urlencoded”。表单提交的地址需要加上如下的php代码。

PHP

// 上传文件时候
if($_FILES['photo']['name'])
{
    //如果没有错误
    if(!$_FILES['photo']['error'])
    {
        // 修改文件名、验证文件大小
        $new_file_name = strtolower($_FILES['photo']['tmp_name']); //重命名文件
        if($_FILES['photo']['size'] > (1024000)) //文件大小不能超过1 MB,单位B
        {
            $valid_file = false;
            $message = '您上传的文件超出了限制大小';
        }

        $imgType=array('image/jpg','image/gif','image/png','image/bmp','image/pjpeg');
        if(!in_array($_FILES['photo']['type'], $imgType)){  //判断图片文件的格式
            $valid_file = false;
            $message = '您上传的文件格式不对';
        }

        //if the file has passed the test
        if($valid_file)
        {
            //把文件保存到你所想要保存的上传目录
            move_uploaded_file($_FILES['photo']['tmp_name'], 'uploads/'.$new_file_name);
            $message = '文件上传成功';
        }
    }
    //当出错的时候
    else
    {
        //设置返回的信息
        $message = '上传的时候发生了如下错误哦:  '.$_FILES['photo']['error'];
    }
}

//每个上传的文件都可以获取如下信息:
$_FILES['field_name']['name']
$_FILES['field_name']['size']
$_FILES['field_name']['type']
$_FILES['field_name']['tmp_name']

限制上传文件的大小的配置:

修改php配置php.ini

file_uploads = on;是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir = "/tmp";文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize = 8m;望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size = 8m; 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M

一般地,设置好上述四个参数后,上传<=8M的文件是不成问题,在网络正常的情况下。
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。
进一步配置以下的参数

max_execution_time = 600;每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time = 600;每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit = 8m;每个PHP页面所吃掉的最大内存,默认8M

修改webserver的配置

对于上传文件很多人都只会关注php的配置,其实也要注意webserver中有没有限制。
比如之前我用的lighttpd的配置中有

server.max-request-size = 65000

它会限制http请求的大小,修改它即可。其他webserver中应该也有类似的对请求大小的限制。