2014-01-19 2 views
1

Я делаю проект zend, который имеет функцию загрузки файлов, и клиент хотел зашифровать и загрузить файлы без их расширения. Я сделал это прекрасно, используя следующий код:Расшифровать файл, загруженный в фреймворк Zend при загрузке

$upload = new Zend_File_Transfer_Adapter_Http(); 
$salt = $upload->getHash('md5', 'file_name'); 
$upload->addFilter('Rename', array('target' => APPLICATION_PATH . '/../../uploads/presentations/'.$salt)); 
$upload->addFilter('Encrypt', array('adapter' => 'mcrypt', 'key' => $constants->encryption_key)); 
$upload->receive(); 

Это работает отлично теперь я просто загрузив файл со следующим кодом

$filename = 'example_presentation_file.ppt'; //original name in db. by the way this coming from database 
$hash = '85be69db87a43265a44be1482cc6d819'; //changed file name when uploaded with this 
$mime = 'application/octet-stream'; 
$file_path = APPLICATION_PATH . '/../../uploads/presentations/'.$hash; 
header('Content-Type: "'.$mime.'"'); 
header('Content-Disposition: attachment; filename="'.$filename.'"'); 
header("Content-Transfer-Encoding: binary"); 
header('Expires: 0'); 
header('Pragma: no-cache'); 
$size = filesize($file_path); 

if(isset($_SERVER['HTTP_RANGE'])) 
{ 
    list($a, $range) = explode("=",$_SERVER['HTTP_RANGE'],2); 
    list($range) = explode(",",$range,2); 
    list($range, $range_end) = explode("-", $range); 
    $range = intval($range); 
    if(!$range_end) { 
     $range_end = $size-1; 
    } 
    else { 
     $range_end = intval($range_end); 
    } 
    $new_length = $range_end-$range+1; 
    header("HTTP/1.1 206 Partial Content"); 
    header("Content-Length: $new_length"); 
    header("Content-Range: bytes $range-$range_end/$size"); 
} 
else { 
    $new_length = $size; 
    header("Content-Length: ".$size); 
} 
@ob_end_clean(); 
$speed = false; 
$chunksize = ($speed?($speed * 1024):(1024 * 1024)) ; 
$bytes_send = 0; 
$buffer = ""; 
if ($file = fopen($file_path, 'r')) { 
    if(isset($_SERVER['HTTP_RANGE'])) { 
     fseek($file, $range); 
    } 
    while(!feof($file) && (!connection_aborted()) && ($bytes_send<$new_length)) { 
     $buffer = fread($file, $chunksize); 
     print($buffer); 
     flush(); 
     if($speed) {  
      if($type!=2) sleep(1); 
     } 
     $bytes_send += strlen($buffer); 
    } 
    fclose($file); 
} 

Этот код работает очень хорошо, и загрузить файл но когда я открываю этот файл в powerpoint, он не открывает его и отображает ошибку.

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

Спасибо.

ответ

1

Я предлагаю следующий рабочий процесс:

  1. Временных расшифровать файл и сохранить его где-нибудь
  2. Отправить этот расшифрованный файл клиент
  3. Удалить расшифрованный файл из файловой системы

Пример:

<?php 

/* ... */ 

$options = array(
'adapter' => 'mcrypt', 
'key'  => $constants->encryption_key); 


$decrypt = new Zend_Filter_File_Decrypt($options); 

// temp. decrypt file and save it on the disc 
$decrypted_file_path = APPLICATION_PATH . '/../../uploads/presentations/'. $filename; 
$decrypt->setFilename($decrypted_file_path); 

// encrypted file location 
$decrypt->filter($file_path); 

/* your code: Send $decrypted_file_path to the client */ 

// remove decrypted file 
unlink($decrypted_file_path); 
+0

Точно, как я думал. Есть ли другой способ сделать это. Кстати спасибо за это. –

+0

@ ManishJangirBlogaddition.com, я сомневаюсь, что есть еще одно жизнеспособное решение –

Смежные вопросы