открыть зашифрованный файл - PullRequest
1 голос
/ 03 июня 2010

Я ищу способ открыть зашифрованные файлы, которые хранятся на сервере. Я использую 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;
    }
}  

Но еще один побочный эффект от этого (я полагаю) заключается в том, что теперь вместо того, чтобы открывать или сохранять диалог, единственный вариант - сохранить файл. Я предпочел бы иметь возможность, если это возможно.


edit - окончательный код:

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 ]

1 голос
/ 04 июня 2010

Почему вы должны записать во временный файл? Вы можете просто сделать что-то вроде этого,

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 голос
/ 03 июня 2010

Но еще один побочный эффект от этого (я полагаю) заключается в том, что теперь вместо открытия диалога открытия или сохранения единственным вариантом является сохранение файла. Я предпочел бы иметь возможность, если это возможно

Попробуйте заменить

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

с фактическим типом файла. Например, если это PDF:

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

Вы также можете отказаться от строки:

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

, чтобы браузер не отображал никаких диалогов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...