2010-06-03 80 views
1

我正在尋找一種方法來打開存儲在服務器上的加密文件。我正在使用mcrypt來加密文件。打開加密文件

我最初打算創建一個能夠打開文件,解密文件,將其寫入新位置然後打開文件的類。但我確信自己有更好的方法(我只是不知道它是什麼)。一旦解密後,似乎應該有一種方法將它(?)傳輸到瀏覽器。

初始設置將鏈接到文件位置,瀏覽器將接管(例如,.pdf文件將彈出提供打開或保存文件的對話框)。如果可能的話,我希望它在解碼後也能做到這一點。

指針?建議嗎? Bueller?

謝謝!


編輯:

這是什麼工作現在:

function decryptFile($path){ 
    $folder=BASE_PATH.$path.'/'.$this->uri->segment(4); 
    if(!file_exists($folder.'/tmp')){ 
     mkdir($folder.'/tmp', 0700); 
     chmod($folder.'/tmp', 0700); 
    } 
    $tmpfn=BASE_PATH.$path.'/'.$this->uri->segment(4).'/tmp/'.$this->uri->segment(5); 
    $p=BASE_PATH.$path.'/'.$this->uri->segment(4).'/'.$this->uri->segment(5); 
    $pc=file_get_contents($p) or die ('no gfc'); 
    $pcue=$this->encrypt->decode($pc,$this->e_key) or die ('no decode'); 
    $pp=fopen($tmpfn,"w") or die ('no fopen'.$tmpfn); 
    fwrite($pp,$pcue) or die ('no write'); 
    fclose($pp); 

    if (file_exists($tmpfn)) { 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($tmpfn)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . filesize($tmpfn)); 
     ob_clean(); 
     flush(); 
     readfile($tmpfn); 
     unlink($tmpfn); 
     exit; 
    } 
} 

但是做這種方式(我猜)的另一個副作用是,現在不是越來越開放或保存對話框,唯一的選擇是保存文件。如果可能,我寧願選擇。


編輯 - 最終代碼:

function decryptFile(){ 
    extract($_POST); 
    $folder = $this->uri->segment(3); 
    $clientFolder = $this->uri->segment(4); 
    $fileName = $this->uri->segment(5); 
    $filePath=BASE_PATH.$folder.'/'.$clientFolder.'/'.$fileName; 
    $fileContents=file_get_contents($filePath) or die ('Could not get file contents.'); 
    $ue_fileContents=$this->encrypt->decode($pc,$this->e_key) or die ('Could not decode.'); 
    header('Content-Description: File Transfer'); 
    header('Content-Type: '.$type); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
    header('Pragma: public'); 
    header('Content-Length: ' . strlen($ue_fileContents)); 
    echo $ue_fileContents; 
    exit; 
} 

回答

1

爲什麼你必須寫一個臨時文件?你可以簡單地做這樣的事情,

function decryptFile($path){ 
    $folder=BASE_PATH.$path.'/'.$this->uri->segment(4); 
    $tmpfn=BASE_PATH.$path.'/'.$this->uri->segment(4).'/tmp/'.$this->uri->segment(5); 
    $p=BASE_PATH.$path.'/'.$this->uri->segment(4).'/'.$this->uri->segment(5); 
    $pc=file_get_contents($p) or die ('no gfc'); 
    $pcue=$this->encrypt->decode($pc,$this->e_key) or die ('no decde'); 
     header('Content-Description: File Transfer'); 
     header('Content-Type: application/octet-stream'); 
     header('Content-Disposition: attachment; filename='.basename($tmpfn)); 
     header('Content-Transfer-Encoding: binary'); 
     header('Expires: 0'); 
     header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
     header('Pragma: public'); 
     header('Content-Length: ' . strlen($pcue)); 
     echo $pcue; 
     exit; 

} 
1

但是做這種方式(我猜)的另一個副作用是,現在不是得到一個打開或保存對話,唯一的選擇是保存文件。我寧願有可能的話

嘗試選項與實際類型的文件,以取代

header('Content-Type: application/octet-stream'); 

。舉例來說,如果它是一個PDF:

header('Content-type: application/pdf'); 

您還可能要刪除的行:

header('Content-Disposition: attachment; filename='.basename($tmpfn)); 

所以沒有對話由瀏覽器中顯示。