Php 下载时解密Zend Framwork中上载的文件

Php 下载时解密Zend Framwork中上载的文件,php,zend-framework,file-io,zend-form-element,zend-file,Php,Zend Framework,File Io,Zend Form Element,Zend File,我正在制作一个zend项目,该项目具有文件上载功能,客户端希望在不使用扩展名的情况下加密和上载文件。我通过使用以下代码完美地做到了这一点: $upload = new Zend_File_Transfer_Adapter_Http (); $salt = $upload->getHash('md5', 'file_name'); $upload->addFilter('Rename', array('target' => APPLICATION_PATH . '/../../u

我正在制作一个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);
}
$filename='example\u presentation\u file.ppt'//数据库中的原始名称。顺便说一下,这是来自数据库的
$hash='85be69db87a43265a44be1482cc6d819'//使用此文件上载时更改了文件名
$mime='应用程序/八位字节流';
$file\u path=应用程序路径。'/..//上传/演示文稿/“.$hash;
标题('Content-Type:“'.$mime.'”);
标题('Content-Disposition:attachment;filename=“.”.$filename.'”);
标题(“内容传输编码:二进制”);
标题('Expires:0');
标题('Pragma:no cache');
$size=filesize($file\u路径);
如果(isset($\u服务器['HTTP\u范围]]))
{
列表($a,$range)=分解(“=”,$\u服务器['HTTP\u range',2);
列表($range)=分解(“,”,$range,2);
列表($range,$range_end)=分解(“-”,$range);
$range=intval($range);
如果(!$range\u end){
$range_end=$size-1;
}
否则{
$range\u end=intval($range\u end);
}
$new\u length=$range\u end-$range+1;
标题(“HTTP/1.1 206部分内容”);
标题(“内容长度:$new_长度”);
标题(“内容范围:字节$Range-$Range_end/$size”);
}
否则{
$new_length=$size;
标题(“内容长度:.$size”);
}
@ob_end_clean();
$speed=false;
$chunksize=($speed?($speed*1024):(1024*1024));
$bytes\u send=0;
$buffer=“”;
如果($file=fopen($file\u路径,'r')){
如果(isset($\u服务器['HTTP\u范围]])){
fseek($file,$range);
}

当(!feof($file)&&(!connection_aborted())&&($bytes_send时,我建议使用以下工作流:

  • 临时解密加密文件并将其保存在某个位置
  • 将此解密文件发送到客户端
  • 从文件系统中删除已解密的文件
  • 例如:

    <?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);
    

    正是我所想的。还有其他方法吗?顺便说一句,谢谢你。@ManishJangirBlogaddition.com,我怀疑还有其他可行的解决方案