【问题标题】:delete a file after download in codeigniter在codeigniter中下载后删除文件
【发布时间】:2023-03-05 08:29:01
【问题描述】:

我想在用户下载我的文件后从下载目录中删除它。但它没有被删除。我正在使用 Codeigniter download_helper 下载文件。 以下是我的代码:

控制器

public function download($key,$id)
{
    $link=$this->article->download($key,$id);//get record from database via article model
    if(empty($link))
    {
        show_404(); 
    }
    force_download(DOWNLOADS_PATH.$link->file_name, NULL);//download file
    $this->article_lib->remove_downloaded($link->file_name);//user has downloaded so now delete this
}

图书馆

public function remove_downloaded($file_name)
{
   if(file_exists(DOWNLOADS_PATH.$file_name))
     {
      unlink(DOWNLOADS_PATH.$file_name);
     }
}

【问题讨论】:

  • 我不明白为什么它不起作用。请务必检查您是否拥有能够删除的文件夹的正确权限
  • @CALlen 我有权限。如果我将 unlink($file_name) 放在 force_download 之前,它会删除它。
  • 如果你把它放在后面会出现什么错误?我以前从来没有遇到过任何问题,但我建议睡一秒钟。也许它需要完成下载才能删除它。我在这里假设。
  • @CALlen 这就是 force_download() 返回 void 的问题,所以我无法检查错误。此外,文件已下载但未删除我没有收到任何错误我只是得到空白网页..
  • 对不起,我删除了评论,因为我看到它没有帮助。我会在这里做一个测试,现在让你知道。试图删除的文件扩展名是什么?

标签: php file download codeigniter-3


【解决方案1】:

你可以在system/helpers/download_helper.php找到为什么它不会被删除,有一个退出,所以你在force_download()之后的所有代码都不会被执行。

//File:  system/helpers/download_helper.php
// From line 135
// Generate the server headers
header('Content-Type: '.$mime);
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Expires: 0');
header('Content-Transfer-Encoding: binary');
header('Content-Length: '.$filesize);
header('Cache-Control: private, no-transform, no-store, must-revalidate');

// If we have raw data - just dump it
if ($data !== NULL)
{
    exit($data);
}

// Flush 1MB chunks of data
while ( ! feof($fp) && ($data = fread($fp, 1048576)) !== FALSE)
{
    echo $data;
}

fclose($fp);
exit;
}

【讨论】:

    【解决方案2】:

    对不起,我没有阅读,但您的代码的问题是它缺少结束 )

        public function remove_downloaded($file_name)
        {
           if(file_exists($file_name)) // here is the problem
             {
              unlink($file_name);
             }
        }
    

    此外,强制下载的工作方式是之后的任何内容都不会运行。我建议在控制器之后使用 ajax 调用。

    更新

    但正如您在评论中提到的,您可以在创建文件之前删除该文件,如本文Unlink after force download not working Codeigniter中所述

    【讨论】:

    • 更新了答案。请看上面的答案
    • 不,我只是向您展示了错字在哪里:) 但是您这样做的方式是正确的,在下载之前将其删除,因为在我的测试中,在 force_download 之后没有任何运行
    • 在下载之前不删除@CALlen只是为了确保我有足够的权限,如果我在下载之前将其删除,那么我要下载什么?
    • 好的,那么我的第一个选择是最好的。下载后您将使用 ajax 调用来删除它。这实际上就是我在项目中的做法。只是我不使用 force_download 选项。
    • 没问题。很高兴我能提供帮助
    【解决方案3】:

    我使用ignore_user_abort(true) 函数 (docs) 解决了这个问题,它对我有用。

    试试下面的代码,

    public function download($key, $id)
    {
        $link = $this->article->download($key, $id);//get record from database via article model
        if (empty($link)) {
            show_404();
        }
    
        force_download(DOWNLOADS_PATH . $link->file_name, NULL);//download file
    
        ignore_user_abort(true); // Set whether a client disconnect should abort script execution
        if (connection_aborted()) {
            $this->article_lib->remove_downloaded($link->file_name);//user has downloaded so now delete this
        }
    }
    

    【讨论】:

      【解决方案4】:

      下载时您传递的是您要下载的文件的完整路径,但在删除它时,我的意思是在取消链接时您只传递文件名。

      所以请尝试一下:

      public function download($key,$id)
      {
          $link=$this->article->download($key,$id);//get record from database via article model
          if(empty($link))
          {
              show_404(); 
          }
          force_download(DOWNLOADS_PATH.$link->file_name, NULL);//download file
          $this->article_lib->remove_downloaded(DOWNLOADS_PATH.$link->file_name); //Included full path
      }
      

      希望这会有所帮助。

      【讨论】:

      • 真正的道歉是一个错字,我现在已经在我的问题中更正了
      • 哦,那需要考虑一下
      【解决方案5】:

      只需在控制器功能中替换

      这个:

      $this->article_lib->remove_downloaded($link->file_name);
      

      与:

      $this->article_lib->remove_downloaded(DOWNLOADS_PATH.$link->file_name);
      

      或者可能:

      $this->article->remove_downloaded(DOWNLOADS_PATH.$link->file_name);
      

      【讨论】:

      • 真正的道歉是一个错字,我现在已经在我的问题中更正了。
      • 没有。它不去那里,可以说我回显 1;它在 force_download 之后没有显示在浏览器中
      • @yaxe 我在帖子的某处读到调用 force_download 函数后没有代码工作
      • 也许我们可以强制标头一些如何使它工作这就是我正在寻找的。​​span>
      • @yaxe 请检查this link 可能会有所帮助。
      【解决方案6】:

      确保您删除的是文件而不是目录。如果不确定 然后试试这个。它也会删除文件和目录

      function rrmdir($dir) {
      if (is_dir($dir)) {
          $files=scandir($dir);
          foreach ($files as $file)
           if ($file != "." && $file != "..") rrmdir("$dir/$file");
          rmdir($dir);
      }
      else if (file_exists($dir)) unlink($dir);
      }
      

      【讨论】:

      • 我只想删除该文件,否则它将删除所有下载文件以及下载目录。
      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      相关资源
      最近更新 更多