强制下载CodeIgniter

时间:2017-10-19 17:30:36

标签: php codeigniter

public function download($id,$file_name)
{
    $this->load->helper('download');
    force_download( NULL,base_url().'uploads/files/'.$file_name);
}

我正在使用此功能下载文件。文件的id和文件名传递给函数。但无论何时下载该文件,它的大小都会变得非常小,而且文件也不会执行。

我已经尝试过的事情:

  • 尝试用一些随机名称替换NULL,同样的事情发生了
  • 替换文件名和文件路径,发生了同样的事情
  • 试图通过存储一些变量来传递这些值,同样发生了

我想提及的事情:

  • 文件存储在localhost中我正在使用wamp服务器
  • 不会下载原始文件,这意味着它会自动创建一个同名的新文件或我在该函数中传递的名称。

  • 我想下载的文件是.exe或.apk

我想要做的是,我想下载相同的原始文件,甚至它是原件的副本,然后它必须是可执行的(for .exe)

2 个答案:

答案 0 :(得分:0)

做你的修改。

function download($path, $name)
{
  // make sure it's a file before doing anything!
  if(is_file($path))
  {
    // get the file mime type using the file extension
    $this->load->helper('file');

    $mime = get_mime_by_extension($path);

    // Build the headers to push out the file properly.
    header('Pragma: public');     // required
    header('Expires: 0');         // no cache
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Last-Modified: '.gmdate ('D, d M Y H:i:s', filemtime ($path)).' GMT');
    header('Cache-Control: private',false);
    header('Content-Type: '.$mime);  // Add the mime type from Code igniter.
    header('Content-Disposition: attachment; filename="'.basename($name).'"');  // Add the file name
    header('Content-Transfer-Encoding: binary');
    header('Content-Length: '.filesize($path)); // provide file size
    header('Connection: close');
    readfile($path); // push it out
    exit();
}

答案 1 :(得分:0)

您正在将null传递给filename参数,您需要将其传递给data参数(第二个参数),因此您的代码应该是这样的

public function download($id,$file_name)
{
    $this->load->helper('download');
    force_download(FCPATH.'/uploads/files/'.$file_name, null);
}

另外,不要将base_url()与路径连接起来,您可以将路径传递给base_url('/path/to/file')函数,然后将链接返回到该文件。

我注意到您传递了$id变量,但未使用它,您是否在未包含的代码的另一部分中使用它?

为什么你甚至有一个函数来调用force_download()函数?你不能在控制器内部调用它吗?