在codeigniter中下载后删除文件

时间:2018-02-19 15:21:59

标签: php file download codeigniter-3

我想在用户下载后从下载目录中删除我的文件。但它没有被删除。我正在使用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);
     }
}

5 个答案:

答案 0 :(得分:1)

抱歉,我没有阅读,但您的代码存在的问题是它错过了结束)

    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中所述

答案 1 :(得分:1)

我使用app.post('/compare', function (req, res, next) { var options = { host: 'hostname', port: 80, path: '/service', method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Authorization': "Basic " + new Buffer(username + ":" + pass).toString("base64") }, body: JSON.stringify({ requestType: 'createService' }) }; var httpreq = http.request(options, function (response) { response.on('data', function (chunk) { console.log("body: " + chunk); }); response.on('end', function() { res.send('ok'); }) }); httpreq.end(); }); 函数( docs )来解决此问题,这对我有用。

尝试以下代码,

ignore_user_abort(true)

答案 2 :(得分:0)

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

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);
}

答案 3 :(得分:0)

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

所以请尝试:

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
}

希望这有帮助。

答案 4 :(得分:0)

只需替换控制器功能

<强>这样:

$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);