我有一个工作文件上传系统,但我需要加密上传的文件而不保存服务器上的真实文件。
我尝试使用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;
}
}
答案 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()
。请注意,整个概念对于大文件来说可能是一个非常糟糕的想法 - 它可能会运行缓慢,并且会让内存超出问题。