Я ищу способ открыть зашифрованные файлы, которые хранятся на сервере. Я использую 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;
}
Почему вам нужно писать во временный файл? Вы можете просто сделать что-то вроде этого:
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;
}
Но еще одним побочным эффектом этого способа (я полагаю) является то, что теперь вместо диалога открытия или сохранения единственным вариантом будет сохранение файла. Я бы предпочел иметь возможность, если это возможно,
Попробуйте заменить
header('Content-Type: application/octet-stream');
на фактический тип файла. Например, если это PDF:
header('Content-type: application/pdf');
Вы также можете убрать строку:
header('Content-Disposition: attachment; filename='.basename($tmpfn));
чтобы браузер не показывал диалог.