分享

php 上传文件

 英昌知识汇聚馆 2011-11-17
fileupload.php:
<?php
    /**
     * php上传文件时的配置:
     * 1.file_uploads = on|off :确定服务器上的php脚本是否可以接受上传文件
     * 2.max_execution_time = integer :php脚本在注册一个致命错误之前可以执行的最长时间,以秒为单位
     * 3.memory_limit = integer :设置脚本可以分配到的最大内存,以MB为单位。这可以防止失控的脚本独占服务器内存
     * 4.upload_max_filesize = integer :设置上传文件的大小,以MB为单位,此指令必须小于post_max_size的值
     * 5.upload_tmp_dir = string :设置上传文件在处理之前必须存放在服务器的一个临时位置,直到文件移动到最终目的为止
     * 6.post_max_size = integer :确定通过post方法可以接受的信息大小,以MB为单位
     */
  //要上传文件,必须要表单.详细解析如下;
  /**
   * ENCTYPE="mult ipart/form-data" ,这里是固定写法,否则文件上传失败
     ACTION="upload.php" ,定义要处理上传的程序文件路径
     METHOD="post" ,定义传输方式为 POST ,一般情况下 Form 提交数据都设置为 POST
     
    < input type="hidden" name="MAX_FILE_SIZE" value="10000000" >,这是一个隐藏域, value的值(以字节B为单位)定
    义了上传文件的大小上限,超过这个值时,上传失败。它必须定义在文件上传域的前面 .
    而且这里定义的值不 能超过在 php.ini 文件中 upload_max_filesize 设置的值 , 否则没有意
    义了 . (注意: MAX_FILE_SIZE 的值只是对浏览器的一个建议,实际上它可以被简单 的
    绕过。因此不要把对浏览器的限制寄希望于该值。实际上, PHP.ini 设置中的上传文件最
    大值,是不会 失效的。但是最好还是在表单中加上 MAX_FILE_SIZE ,因为它可以避
    免用户在花时间等待上传大文件之后才发现该文件太大了的麻烦。)
    1MB=1024KB,1KB=1024B,B是byte。
   
    <input type="file" name="userfile" /> , 这是文件上传域 ,Type 属性必须设置为 file, 但 Name属性
    可以自定义 , 这个值会在代码文件中使用 .
   *
   */
 
 
?>
<form enctype="multipart/form-data" action="upload.php" method="post">
    <input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
    上传文件:<input type="file" name="userfile" />
    <input type="submit" value="上传" />
</form>

upload.php:
<?php

  /**
   * 接受上传文件
   * $_FILES 超级全局变量,它储存各种与上传有关的信息,这些信息对于通过 PHP 脚本
上传到服务器的文件至关重要。
1. 存储在 $_FILES["userfile"]["tmp_name"] 变量中的值就是文件在 Web 服务器中临时存
储的位置。
2. 存储在 $_FILES["userfile"]["name"] 变量中的值就是用户系统中的文件名称。
3. 存储在 $_FILES["userfile"]["size"] 变量中的值就是文件的字节大小。
4. 存储在 $_FILES["userfile"]["type"] 变量中的值就是文件的 MIME 类型,例如: text/plain
或 image/gif 。
5. 存储在 $_FILES["userfile"]["error"] 变量中的值将是任何与文件上载相关的错误代码。
这是在 PHP4.2.0 中增加的新特性。 error 分别提供了一些数组常量: 0: 表示没有发生错误, 1:
表示上载文件的大小超出了约定值。文件大小的最大值是 PHP 配置文件中指定的,该指令
是 upload_max_filesize 。 2: 表示上载文件大小超出了 HTML 表单的 MAX_FILE_SIZE 元素 所
指定的最大值。 3: 表示文件只被部分上载。 4: 表示没有上载任何文件。
   */
 
//[userfile][name]表示上传的文件名
//[userfile][type]表示文件的类型
//[userfile][tmp_name]表示上传文件的临时存放位置
//[userfile][error]表示上传文件的错误类型,0表示没有错误
//[userfile][size]表示上传文件的字节大小
print_r($_FILES);

echo '<br>';


define('MAX_SIZE', 20000000);//定义MAX_SIZE常量的值为20M
$fileMimes = array('image/jpeg','image/pjpeg','image/png','image/x-png','image/gif');
//is_uploaded_file():判断文件是否通过HTTP POST上传的。
//通过HTTP POST上传后,文件会存放在临时文件夹下


//第二个问题,只能充许jpg类型文件上传.下面的代码在ie下会有bug。因为在ie中上传的.jpg文件,后缀会变成jpeg。

/*if($_FILES['userfile']['type']!='image/jpeg'){
    echo "<script>alert('本站只充许jpg格式上传');history.back();</script>";
    exit;
}*/


//所以,为了兼容ie与firefox下导致上传的.jpg文件能正确执行。需要采用如下的代码。
/*if($_FILES['userfile']['type']!='image/jpeg' && $_FILES['userfile']['type']!= 'image/pjpeg'){
    echo "<script>alert('本站只充许jpg格式上传');history.back();</script>";
    exit;
}*/

switch ($_FILES['userfile']['type']) {
    case 'image/jpeg': //火狐支持的
    ;
    break;
    case 'image/pjpeg': //ie 支持的
    break;
    case 'image/gif':
    break;
    case 'image/png': //火狐支持的
    break;
    case 'image/x-png'://ie支持的
    break;
    default:echo "<script>alert('本站只充许jpg、Png、gif格式的文件上传');history.back();</script>";
    exit;
}
//将上面的switch代码再进行改进。在上面定义一个数组变量$fileMimes.用in_array()函数来判断类型是否为数组中的一种。如下:
//先判断数组变量是否存在
if (is_array($fileMimes)){
    //如果数组变量存在,则判断文件的后缀名是否在定义的数组变量中
    if (!in_array($_FILES['userfile']['type'], $fileMimes)){
        echo "<script>alert('本站只充许jpg、Png、gif格式的文件上传');history.back();</script>";
        exit;
    }
}

//如果需要允许.png,.gif格式的文件上传,用上面的格式写的话,会很复杂。可以考虑采用下面的方式实现


//先判断文件名比先判断文件大小,性能更高





//第一个问题:如果上传错误,怎么办?
if ($_FILES['userfile']['effor']>0){
    switch ($_FILES['userfile']['error']){
        case 1:echo "<script>alert('文件大小超过 PHP 配置文件中指定upload_max_filesize的值');history.back();</script>";
        break;
        case 2:echo "<script>alert('表示上载文件大小超出了 HTML 表单的 MAX_FILE_SIZE 元素 所
指定的最大值。');history.back();</script>";
        break;
        case 3:echo "<script>alert('部分被上传');history.back();</script>";
        break;
        case 4:echo "<script>alert('没有任何文件上传');history.back();</script>";
        break;
    }
   
    exit;
}
//下面这句最后用来判断上传的文件是否超过20M。自定义的。如果在表单中没有指定value的值,则需要在此做判断
if ($_FILES['userfile']['size']>MAX_SIZE){
    echo "<script>alert('上传文件大小不得超过20M');history.back();</script>";
}

if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
   
    //如果找到临时文件,则在这里进行用代码实现移动文件到目的地。函数:move_uploded_file(),返回布尔值
   
    //第一个参数写上临是文件地址,第二个参数写上需要存文件的目的地址(需要先判断目录是否存在)
   
    //如果想屏蔽页面的上警告信息,则需要在代码前加上@符号即可.@move_uploaded_file($_FILES['userfile']['tmp_name'], 'uploads/'.$_FILES['userfile']['name'])
    if (!move_uploaded_file($_FILES['userfile']['tmp_name'], 'uploads/'.$_FILES['userfile']['name'])){
        //移动失败,则执行内部代码
        //echo '移动失败!';
        echo "<script>alert('移动文件失败');history.back();</script>";
        exit;  //后面的代码就不执行
    }
    //echo '上传的临时文件已找到,等待移动中......';
}else {
    echo "<script>alert('找不到上传的文件');history.back();</script>";
    exit;
}
//全部通过就上传成功
//必须传一个值给(文件上传的地址)uploadseccess.php.
echo "<script>alert('文件上传成功');location.href='uploadsuccess.php?url=".$_FILES['userfile']['name']."';</script>";
?>

uploadsuccess.php:
<?php

  //接收upload.php以链接形式传递过来的参数。是get方式
  $url = $_GET['url'];
  echo '<img src="uploads/'.$url.'"/>';
 
?>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多