在Yii2中加密上传的文件

时间:2018-04-17 14:49:03

标签: yii2

我有一个工作文件上传系统,但我需要加密上传的文件而不保存服务器上的真实文件。

我尝试使用security->encryptByKey()函数,但这会返回一个字符串 - 而saveAs()函数在字符串上不可用。 (上传功能在以下代码中没有第4行的情况下工作。)

public function upload()
{
    $filename = Yii::$app->security->generateRandomString();
    $this->file = Yii::$app->security->encryptByKey($this->docFile, Yii::$app->security->generateRandomKey());
    if ($this->file->saveAs(Yii::getAlias('@frontend').'/uploads/encrypted/' . $filename . '.' . $this->file->extension)) {
        return $filename . '.' . $this->file->extension;
    } else {
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

尝试

public function upload(UploadedFile $file, $key)
{
    $filename = Yii::$app->security->generateRandomString();
    $filePath = Yii::getAlias('@frontend') . '/uploads/encrypted/' . $filename . '.' . $file->extension;
    $encryptedContent = Yii::$app->security->encryptByKey(file_get_contents($file->tempName), $key);
    if (file_put_contents($filePath, $encryptedContent)) {
        return $filename . '.' . $file->extension;
    }

    return false;
}

UploadedFile只是简单的帮助,可以简化复制或移动上传的文件,但它不包含文件内容(这是有道理的 - 文件可能只有几GB)。要获得真实内容,您需要file_get_contents()从磁盘读取内容并保存file_put_contents()。请注意,整个概念对于大文件来说可能是一个非常糟糕的想法 - 它可能会运行缓慢,并且会让内存超出问题。