codeigniter文件上传问题

codeigniter自带的文件下载辅助函数非常简单实用,但是在处理大文件的时候,就显得捉襟见肘。

在网上找到了一个对download_helper.php文件的扩展,非常好用,记录下,遇到相同问题的猿友们可以借鉴下。

代码如下:

<?php  if ( ! defined(‘BASEPATH‘)) exit(‘No direct script access allowed‘);
/**
 * Force Download
 *
 * Generates headers that force a download to happen
 *
 * @access    public
 * @param    string    filename
 * @param    mixed    the data to be downloaded
 * @return    void
 */
if ( ! function_exists(‘force_download‘))
{
    function force_download($filename = ‘‘, $file = ‘‘)
    {
        if ($filename == ‘‘ OR $file == ‘‘)
        {
            return FALSE;
        }

        // Try to determine if the filename includes a file extension.
        // We need it in order to set the MIME type
        if (FALSE === strpos($filename, ‘.‘))
        {
            return FALSE;
        }

        // Grab the file extension
        $x = explode(‘.‘, $filename);
        $extension = end($x);

        // Load the mime types
        if (defined(‘ENVIRONMENT‘) AND is_file(APPPATH.‘config/‘.ENVIRONMENT.‘/mimes.php‘))
        {
          include(APPPATH.‘config/‘.ENVIRONMENT.‘/mimes.php‘);
        }
        elseif (is_file(APPPATH.‘config/mimes.php‘))
        {
          include(APPPATH.‘config/mimes.php‘);
        }

        // Set a default mime if we can‘t find it
        if ( ! isset($mimes[$extension]))
        {
            $mime = ‘application/octet-stream‘;
        }
        else
        {
            $mime = (is_array($mimes[$extension])) ? $mimes[$extension][0] : $mimes[$extension];
        }

        // Generate the server headers
        if (strpos($_SERVER[‘HTTP_USER_AGENT‘], "MSIE") !== FALSE)
        {
            header(‘Content-Type: "‘.$mime.‘"‘);
            header(‘Content-Disposition: attachment; filename="‘.$filename.‘"‘);
            header(‘Expires: 0‘);
            header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0‘);
            header("Content-Transfer-Encoding: binary");
            header(‘Pragma: public‘);
            header("Content-Length: ".filesize($file));
        }
        else
        {
            header(‘Content-Type: "‘.$mime.‘"‘);
            header(‘Content-Disposition: attachment; filename="‘.$filename.‘"‘);
            header("Content-Transfer-Encoding: binary");
            header(‘Expires: 0‘);
            header(‘Pragma: no-cache‘);
            header("Content-Length: ".filesize($file));
        }

        readfile_chunked($file);
        die;
    }
}

/**
 * readfile_chunked
 *
 * Reads file in chunks so big downloads are possible without changing PHP.INI
 *
 * @access    public
 * @param    string    file
 * @param    boolean    return bytes of file
 * @return    void
 */
if ( ! function_exists(‘readfile_chunked‘))
{
    function readfile_chunked($file, $retbytes=TRUE)
    {
       $chunksize = 1 * (1024 * 1024);
       $buffer = ‘‘;
       $cnt =0;

       $handle = fopen($file, ‘r‘);
       if ($handle === FALSE)
       {
           return FALSE;
       }

       while (!feof($handle))
       {
           $buffer = fread($handle, $chunksize);
           echo $buffer;
           ob_flush();
           flush();

           if ($retbytes)
           {
               $cnt += strlen($buffer);
           }
       }

       $status = fclose($handle);

       if ($retbytes AND $status)
       {
           return $cnt;
       }

       return $status;
    }
}

/* End of file MY_download_helper.php */
/* Location: ./application/helpers/MY_download_helper.php */

小提示:

  @ 使用的时候,别忘了先加载

    $this->load->helper(‘download‘);

  @ 该扩展和原生的force_download($filename = ‘‘, $data = ‘‘)函数的第二个参数有所不同

    原生的$data为一个字符串,而该函数的$file为需要下载的文件的物理路径!大概是因为fread()只能正确读取全路径的文件的缘故吧,没有求证,知道的猿友请帮忙解释下,谢谢!

    

codeigniter文件上传问题,布布扣,bubuko.com

时间: 2024-10-13 03:10:37

codeigniter文件上传问题的相关文章

雷林鹏分享:CodeIgniter文件上传错误:escapeshellarg() has been disabled for security reasons

CodeIgniter文件上传错误:escapeshellarg() has been disabled for security reasons 原因:escapeshellarg函数被禁止 解决方法: 1.修改PHP配置文件php.ini,找到 disable_functions 字段,删除 escapeshellarg . 2.重启php-fpm(nginx环境). 文章转载自 [http://www.php230.com] (编辑:雷林鹏 来源:网络 侵删) 原文地址:https://w

Codeigniter入门学习笔记11—文件上传

很久很久以前学习Codeigniter的笔记记录,很随意,但都是自己记录的,希望对需要的人有所帮助. 本文使用word2013编辑并发布 Postbird | There I am , in the world more exciting! Postbird personal website : http://www.ptbird.cn 文件上传 1.手动创建好上传目录 2.controllers/user ? 3.views/user/fileAction.php ????//表单需要强调是文

CodeIgniter学习笔记(十四)&mdash;&mdash;CI中的文件上传

首先通过控制器的方法跳转至视图 public function file() { $this->load->helper('url'); $this->load->view('file'); } 在视图中创建一个表单用于选择并上传文件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Docum

jquery uploadify 多文件上传插件 使用经验

Uploadify 官网:http://www.uploadify.com/ 一.如何使用呢? 官网原文:http://www.uploadify.com/documentation/uploadify/implementing-uploadify/在我理解的基础上,做了一些翻译吧,建议直接看官网原文,因为截止到发布这篇博客为止,官方的版本是v3.2.1使用之前我们来看下使用的最低要求. 要求 jQuery 1.4.x 或更新的版本Flash Player 9.0.24 或更新的版本服务器端实现

简单利用filetype进行文件上传

对于文件上传大家都很熟悉了,毕竟文件上传是获取webshell的一个重要方式之一,理论性的东西参考我的另一篇汇总文章<浅谈文件解析及上传漏洞>,这里主要是实战补充一下理论内容--filetype漏洞! filetype漏洞主要是针对content-type字段,主要有两种利用方式:    1.先上传一个图片,然后将content-type:image/jpeg改为content-type:text/asp,然后对filename进行00截断,将图片内容替换为一句话木马. 2.直接使用burp抓

jquery-ajax实现文件上传异常处理web.multipart.MultipartException

异常如下: org.springframework.web.multipart.MultipartException: The current request is not a multipart request 原因分析: 可能原因1: form表单中没有添加 enctype="multipart/form-data" 属性 可能原因2: 请求方式必须为post,如果不是则必定出错 可能原因3: 请求的contentType不是"multipart/form-data&qu

SpringMVC中文件上传的客户端验证

SpringMVC中文件上传的客户端验证 客户端验证主要思想:在jsp页面中利用javascript进行对文件的判断,完成验证后允许上传 验证步骤:1.文件名称 2.获取文件的后缀名称 3.判断哪些文件类型允许上传 4.判断文件大小 5.满足条件后跳转后台实现上传 前台界面(验证上传文件是否格式满足要求): <body> <h2>文件上传</h2> <form action="upload01" method="post" 

文件上传

1.上传的步骤: a.导入SmartUpload.jar b.创建一个上传的类的对象 c.初始化 d.上传至服务器 e.保存 表单提交时需要指定enctype="multipart/form-data"(多数据类型提交) http://www.atguigu.com/opensource.shtml#3(包下载地址) package com.zuxia.servlet; import java.io.IOException;import java.io.PrintWriter; imp

python+selenium文件上传

1.input标签类元素文件上传 先定位到文件上传元素id,再使用方法send_keys(文件路径) 2.非input标签 备注:非input标签的文件上传,就不适用于此方法了,需要借助autoit工具或者SendKeys第三方库.