<?php

class FileController extends mfBaseController {
  
  protected function init() {
    $this->needlogin=true;
    $me = new User();
    $me->loadMe();
    $this->me = $me;
    $this->layout()->set("me",$me);
    
    /*if(!$me->isAdmin()) {
      $this->redirect("Dashboard");
    }*/
  }
  
  
  protected function downloadAction() {
    $id = $this->request->id;
    if(!is_numeric($id) || $id < 1) {
      return true;
    }
    
    $file = new File($id);
    if(!$file) {
      throw new Exception("File not found", 404);
    }
    $filename = $file->store_filename;
    $path = MFUPLOAD_FILE_SAVE_PATH;
    $path .= ($file->subfolder) ? "/".$file->subfolder : "";
    $path .= "/$filename";
    
    if(!file_exists($path)) {
      throw new Exception("File not found", 4041);
    }
    
    if(preg_match('/\.([^.]+)/',$filename,$m)) {
      $ext .= $m[1];
    } else {
      throw new Exception("File not found", 4042);
    }

    $outname = ($file->filename) ? $file->filename : $file->orig_filename;
    
    if(!$this->sendfile($path, $outname)) {
      throw new Exception("File not found", 4043);
    }
    exit;
  }
  
  private function sendfile($file,$name) {
    $this->log->debug("sendfile: $file $name");
    if (!$fh = fopen($file, 'r')) {
      return false;
    }

    set_time_limit(36000);
    header('Content-Type: application/octet-stream');
    header('Content-disposition: attachment; filename="' . $name . '"');
    
    $size = exec('stat -c %s '.escapeshellarg($file));
    
    if(strlen($size)) {
      if($size < (pow(2,31))-1) {
        header('Content-Length: ' . $size);
      }
    }
    
    while (!feof($fh)) {
      $data = fread($fh, 8192);
      echo $data;
    }
    return true;
  }

}