打开加密文件

时间:2010-06-03 18:51:25

标签: php file encryption

我正在寻找一种方法来打开存储在服务器上的加密文件。我正在使用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;
}

2 个答案:

答案 0 :(得分:1)

  

但这样做的另一个副作用(我猜)是现在不是打开或保存对话,唯一的选择是保存文件。如果可能,我宁愿选择

尝试替换

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

使用文件的实际类型。例如,如果它是PDF:

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

您可能还想删除该行:

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

以便浏览器不显示任何对话框。

答案 1 :(得分: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;

}