【问题标题】:Decrypt File Uploaded In Zend Framwork While Download下载时在 Zend 框架中解密文件上传
【发布时间】:2014-01-19 16:22:38
【问题描述】:

我正在制作一个具有文件上传功能的 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 中打开该文件时,它没有打开它并显示错误。

关键是,如果我禁用文件加密,我打开得很好,但这是必要的。我只是想知道如何在运行时解密文件(只是当用户下载它而不是永远)。

谢谢。

【问题讨论】:

    标签: php zend-framework file-io zend-form-element zend-file


    【解决方案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);
    

    【讨论】:

    • 跟我想的一模一样。有没有其他方法可以做到这一点。顺便谢谢你。
    • @ManishJangirBlogaddition.com,我怀疑还有其他可行的解决方案
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多